行为化参数

Java8内置的四大核心函数式接口:

  • Consumer:消费型接口
    void accept(T t);

  • Supplier:供给型接口
    T get();

  • Function:函数型接口
    R apply(T t);

  • Predicate:断言型接口
    boolean test(T t);

Stream

流API

要想记住这些方法,最简单的方式就是多查看 Stream 类的 API
Java8 In Action - 图1

原始类型流特化

IntStream,DoubleStream,LongStream
要记住,这几个特化的原因并不在于流的复杂性,而是装箱造成的复杂性—-即类似 int 和 Integer 之间的效率差异。

基本使用(求和):

  1. int sum = menu.stream()
  2. .mapToInt(Dish::getCalories) // 注意,若使用map会返回Stream<Integer>,它是没有sum操作的
  3. .getCalories();

默认值 OptionalInt(求最大值):

  1. OptionalInt maxCalories = menu.stream()
  2. .mapToInt(Dish::getCalories)
  3. .max();
  4. // 若没有最大值,就可以显示处理默认值了
  5. int max = maxCalories.orElse(1);

转换回对象流:

  1. IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
  2. Stream<Integer> stream = intStream.boxed();

数值范围:

  1. // 一个从1到100的偶数流,计算偶数个数 --》 有50个,rangeClose包含结尾
  2. IntStream evenNumbers = IntStream.rangeClosed(1, 100).filter(i -> i % 2 == 0);
  3. // 如果使用 range,则只有49个,因为 range 是不包括结尾的

构建流

值创建流:

  1. Stream<String> stream = Stream.of("Java8", "In", "Action");
  2. // 如果想得到一个空流,则如下
  3. Stream<String> empty = Stream.enpty();

数组构建流:

  1. // 注意这里构造的是 IntStream,所有就有 sum 方法了,Stream是没有sum方法的
  2. int sum = Arrays.stream(new int[]{1, 2}).sum();

文件创建流:
Java 中的 NIO ;Files 工具类

  1. // 会返回每一行为一个字符串流
  2. Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset()) ;

Collectors收集器静态方法

toList() List 将流中所有项目收集到一个List List l = stream.collect(toList());
toSet() Set 将流中所有项目收集到一个Set Set s = stream.collect(toSet());
toCollection Collection 将数据转换为指定的集合 Collection c = stream.collect(toCollection(),ArrayList::new);Collection c = stream.collect(toCollection(),HashSet::new);
counting() Long 计算流中数量 long l = stream.collect(counting());
summingInt() Integer 返回流中整数属性求和 int i = stream.collect(summingInt( T::getXX ));
averagingInt() Double 计算流中Integer属性的平均值 double d = stream.collect(averagingInt(T::getXX));
summarizingInt() IntSummaryStatistics 收集流中Integer属性的统计值 IntSummaryStatistics i = stream.collect(summarizingInt(T::getXX));
joining() String 将流中每个元素调用toString方法拼接 String s = stream.collect(joining(“ , “);
maxBy() Optional 筛选流中最大元素的Optional,流为空则Optional.empty() Optional o = stream.collect(maxBy(Comparator.comparingInt(T::getXX)));
minBy() Optional 筛选流中最小元素的Optional,流为空则Optional.empty() Optional o = stream.collect(minBy(Comparator.comparingInt(T::getXX)));
reducing() 归约操作产生的类型 从初始值开始,利用BinaryOperator与流中每个元素相结合,从而将流归约成单个值 int i = stream.collect(reducing(0, T::getXX, Integer :: sum));
collectingAndThen() 转换函数返回的类型 包裹一个收集器,对其结果应用转换函数 int i = stream.collect(collectingAndThen(toList(),List :: size);
groupingBy() Map> 根据流中一个属性的值做分组,并以该属性为Map的一个Key Map> map = stream.collect(groupingBy(T::getXX));
partitioningBy() Map> 根据对流中的每个元素的应用谓词的结果进行分区(true,false) Map> map = stream.collect(partitioningBy(T::isXX));

作者:Snow_DZG
链接:https://www.jianshu.com/p/a9ad46f86fb4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 |