一、好处
1.直接阅读代码的字面意思 即可完美展示无关逻辑方式的语义: 获取流、 过滤姓张、 过滤长度为3、逐一打印
2.Stream流把真正的函数式编程风格引入到Java中
3.代码简洁
看下面的案例即可明白
创建一个集合,存储多个字符串元素
把集合中所有以"张"开头的元素存储到一个新的集合
把"张"开头的集合中的长度为3的元素存储到一个新的集合
遍历上一步得到的集合
A.普通方式:
B.使用Stream流之后:
一行代码就解决。
总的来说
Java的Stream流使得集合数组操作更为方便、直观,同时提高了代码的可读性和可维护性。
注意:
在Java中,使用Stream API进行流操作时,原始集合或数组中的数据不会被修改。Stream操作返回一个新的流或集合,而原始数据集保持不变。流操作本身是非破坏性的,这意味着你可以安全地对集合进行操作而不会影响到原始数据。
二、思想
通过上面的思维导入, Stream流有三种方法:
1.获取流
2.对流的中间操作
3.对流的终结操作
三、获取Stream流
获取Stream流的意思就是:创建一条流水线,并把数据放到流水线上准备进行操作
用法示例:
public class StreamDemo {
public static void main(String[] args) {
//Collection体系的集合可以使用默认方法stream()生成流
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();
Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
//Map体系的集合间接的生成流
Map<String,Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
//数组可以通过Arrays中的静态方法stream生成流
String[] strArray = {"hello","world","java"};
Stream<String> strArrayStream = Arrays.stream(strArray);
//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
Stream<Integer> intStream = Stream.of(10, 20, 30);
}
}
四、中间操作
中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作
用法示例:
ArrayList<String> strings = new ArrayList<>();
Collections.addAll(strings, "a", "b", "c", "d","d", "e", "f", "g", "h");
//过滤 输出d d
strings.stream().filter(m -> m.startsWith("d")).forEach(System.out::println);
//获取前面几个元素 输出a b c
strings.stream().limit(3).forEach(System.out::println);
//跳过前面几个元素 输出d d e f g h
strings.stream().skip(3).forEach(System.out::println);
//元素去重 输出a b c d e f g h
strings.stream().distinct().forEach(System.out::println);
//合并两个流 工具类用法
//输出a b c d d e f g h a b c d d e f g h
Stream.concat(strings.stream(),strings.stream()).forEach(System.out::println);
转换流中的数据类型
//转换流中的数据类型
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三-11","李四-12","王麻子-13","刘婷婷-14");
//匿名内部类写法
list.stream().map(new Function<String, Integer>(){
@Override
public Integer apply(String s) {
String[] arr = s.split("-");
String ageString = arr[1];
return Integer.parseInt(ageString);
}
}).forEach(System.out::println); //11 12 13 14
System.out.println("-----------------------------------------------------");
//函数式接口方法
list.stream()
.map(s -> Integer.parseInt(s.split("-")[1]))
.forEach(System.out::println);//11 12 13 14
五、 终结操作
终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作
终结方法不再返回Stream流,链式操作到终结方法就不能用(.方法)链式操作下去了。
遍历和统计示例:
转换数组示例:
六、收集操作
收集操作就是,将Stream流中的数据放入到数组或集合中返回一个数组或集合
收集操作也是属于终结操作的一种,上面介绍了数组,这里介绍集合。
利用工具类Collectors提供了具体的收集方式
转化为List、Set集合的用例:
转化为Map集合的用例子:
A.函数式接口写法
ArrayList<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");
Map<String, Integer> map = list.stream().filter(
s -> {
String[] split = s.split(",");
int age = Integer.parseInt(split[1]);
return age >= 24;
})
// collect方法只能获取到流中剩余的每一个数据.
//在底层不能创建容器,也不能把数据添加到容器当中
//Collectors.toMap 创建一个map集合并将数据添加到集合当中
// s 依次表示流中的每一个数据
//第一个lambda表达式就是如何获取到Map中的键
//第二个lambda表达式就是如何获取Map中的值
.collect(Collectors.toMap(
s -> s.split(",")[0],
s -> Integer.parseInt(s.split(",")[1]) ));
System.out.println(map);
B.匿名内部类写法
注意:在转化为Map集合的时候,如果键有重复,就会报错。
标签:java,Stream,stream,list,println,集合,操作 From: https://blog.csdn.net/2202_75483664/article/details/140849469