美文网首页
Java8 Stream method

Java8 Stream method

作者: Tinyspot | 来源:发表于2022-08-20 09:26 被阅读0次

Comparator

  • Comparator.comparing(Function<T, U>)
// java.util.Collections#sort(java.util.List<T>, java.util.Comparator<? super T>)
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}
// e.g.
List<Apple> apples = new ArrayList<>();
Collections.sort(apples, new Comparator<Apple>() {
    @Override
    public int compare(Apple o1, Apple o2) {
        return o1.getWeight() - o2.getWeight();
    }
});
// e.g.
apples.sort(Comparator.comparing(Apple::getWeight));
Collections.sort(employees, (o1, o2) -> o1.getAge() - o2.getAge());

Collectors

  • Collectors.toList()
  • Collectors.maxBy(Comparator<? super T> comparator)
  • Collectors.summingInt(ToIntFunction<? super T> mapper), averagingInt
  • Collectors.summarizingInt(ToIntFunction<? super T> mapper)
  • Collectors.joining(CharSequence delimiter)
  • 广义的规约 Collectors.reducing(U identity,Function mapper,BinaryOperator op)
import static java.util.stream.Collectors.*;

Comparator<OrderDO> comparator = Comparator.comparingInt(OrderDO::getId);
Optional<OrderDO> maxId = list.stream().collect(Collectors.maxBy(comparator));
// 字符串连接
String names = list.stream().map(OrderDO::getName).collect(Collectors.joining(","));
// 汇总
Integer collect = list.stream().collect(summingInt(OrderDO::getId));
Integer collect2 = list.stream().mapToInt(OrderDO::getId).sum();
Integer collect3 = list.stream().collect(reducing(0, OrderDO::getId, (i, j) -> i + j));
Integer collect4 = list.stream().map(OrderDO::getId).reduce(0, (i, j) -> i + j);

groupBy

  • Map<K, List<T>> Collectors.groupingBy(Function classifier)
  • Function 是分类函数,分组的结果是一个Map
  • 键:分类值,值:包含分类值的列表
  • 操作分组元素
    • Collectors.groupingBy(Function classifier, Collector downstream)
    • 过滤操作 Collectors.filtering(Predicate predicate, Collector downstream)
    • 映射操作 Collectors.mapping(Function mapper, Collector downstream)
  • 多级分组
    • 把内层groupingBy传递给外层groupingBy
    • n级分组就会得到一个代表n级树形结构的n级Map
Map<String, List<OrderDO>> maps = list.stream().collect(groupingBy(OrderDO::getType));
Map<Boolean, List<OrderDO>> collect = list.stream().collect(groupingBy(orderDO -> orderDO.getId() > 20));
// 对分组中的元素进行操作
Map<String, List<OrderDO>> collect1 = list.stream().collect(groupingBy(OrderDO::getType, filtering(orderDO -> orderDO.getId() > 20, toList())));
Map<String, List<Integer>> collect2 = list.stream().collect(groupingBy(OrderDO::getType, mapping(OrderDO::getId, toList())));
// 疑问点
Map<String, Set<String>> collect = goodsList.stream().collect(
      groupingBy(Goods::getName,
            flatMapping(goods -> maps.get(goods.getName()).stream(), Collectors.toSet())));

Map<String, Map<String, List<OrderDO>>> collect2 = orderList.stream().collect(
                groupingBy(OrderDO::getType,   // 一级分类函数
                        groupingBy(OrderDO::getName))); // 二级分类函数
// 分组收集
Map<String, Integer> collect1 = orderList.stream().collect(
                groupingBy(OrderDO::getType, summingInt(OrderDO::getId)));

partitioningBy

  • 分区是分组的特殊情况,由一个谓词作为分类函数,分区函数返回一个布尔值
  • Map 的键类型是 Boolean, 最多有两组:true / false
Map<Boolean, List<OrderDO>> map = orderList.stream().collect(partitioningBy(orderDO -> orderDO.getId() > 20));
 List<OrderDO> result = map.get(true);

source code

  • interface Collector
  • java.util.stream.Collector.Characteristics, IDENTITY_FINISH 恒等函数
  • Stream.collect(Collector collector);
  • 重载方法Stream.collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner);
ArrayList<Object> list = orders.stream().collect(ArrayList::new, List::add, List::addAll);

Collection API

  • 不可变集合
  • Arrays.asList(T... a) 固定大小的列表,若有修改等 java.lang.UnsupportedOperationException
  • Map.of(K k1, V v1)
  • Map.ofEntries(entry(K, V));
  • Map.forEach(BiConsumer<? super K, ? super V> action)

Map 计算模式

  • Map.computeIfAbsent(K key, Function<K, V>) 不存在就添加,存在不处理
  • Map.computeIfPresent(K key, BiFunction<K, V, V>) 存在就覆盖
  • Map.compute(K key, BiFunction<K, V, V>) 不管是否存在都添加

相关文章

  • Java8 Stream method

    Comparator Comparator.comparing(Function) Collector...

  • Java8之Stream流(六)收集

    Java8之Stream流(一)基础体验 Java8之Stream流(二)关键知识点 Java8之Stream...

  • Java 8 Stream--开发手册

    什么是Java8 Stream,为什么需要Stream? Stream是Java8一大亮点,它与 java.io ...

  • Java8 学习笔记

    @(in action系列)[java8, lambda, stream] Java8 学习 java8 能高效的...

  • Stream流

    Stream流 java8新特性 Stream定义 A sequence of elements supporti...

  • java8 stream lambda

    记录Java8的stream操作,供自己复习。 创建Stream Employee类 创建stream方法 for...

  • Java基础04

    Regex: Method Stream Scanner Error

  • JAVA8中Stream学习

    JAVA8中Stream学习 最近看了下Stream的api: Stream用户操作Collection族的数据,...

  • Java8 Stream 流的重用

    Java8 Stream 已经被操作或关闭 引言 在 java8 中,Stream 不能被重用,一旦它被使用或使用...

  • Java8 Stream 使用及其详解

    一、什么是Stream 二、Java7和Java8 聚合操作的区别。 三、Stream 总览 四、Stream 的...

网友评论

      本文标题:Java8 Stream method

      本文链接:https://www.haomeiwen.com/subject/ipwhgrtx.html