JDK8 stream一些操作是将函数作为对象传入。
Stream一些方法如map,接受以函数的形式传参:1.传入Lambda函数形式,类似只有一个接口的匿名内部类:(param1,param2)->{ 函数体},2.传入类似System.out::println形式其中println是静态方法,3.传入类似String::toUpperCase形式其中把遍历的是字符串,调用他们方法内的对象。
得到Stream方法:
Stream<String> stream = Stream.of("a", "b", "c", "d");
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(22);
list.add(23);
list.add(42);
Stream<Integer> stream = list.stream();
将Stream转换成集合类型。
coollect 方法作为终端操作,接受的是一个 Collector 接口参数,能对数据进行一些收集归总操作
List<Integer> list = Stream.of(1, 2, 3, 4).collect(Collectors.toList());
Set<Integer> set = Stream.of(1, 2, 3, 4).collect(Collectors.toSet());
Map<Integer, Integer> map = Stream.of(1, 2, 3, 4).collect(Collectors.toMap(i -> i - 1, i -> i));//两个匿名函数,简写形式,传入i返回i-1和i
他们支持两种类型的操作:中间操作(e.g. filter, map)和终端操作(如count, findFirst, forEach, reduce). 中间操作可以连接起来,将一个流转换为另一个流。这些操作不会消耗流,其目的是建立一个流水线。与此相反,终端操作会消耗类,产生一个最终结果。
List<Integer> list=new ArrayList<>();
list.add(2);
list.add(22);
list.add(23);
list.add(42);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println);
list.stream().filter(i->i>20).forEach(System.out::println);
Stream.of("a", "b", "c", "d").map(String::toUpperCase).forEach(System.out::println);
System.out.println(Stream.of(1, 2, 3, 4).reduce((item,next)->item+next).get());
System.out.println(Stream.of(1, 2, 3, 4).reduce(0,(item,next)->item+next));