java - 流式编程

1.获取流的方法:

// 1.从集合转化
List<Integer> list = new ArrayList<>(); 
Stream<Integer> stream = list.stream();// 转化为流
stream.Collect(Collectors.toList());//转换为流,流再转回为集合。
// 2.自定义初始化
Stream<Integer> stream = Stream.of(1,5,6,4,8,3,1,9);

 

2.流处理算子的使用

2.1 排序

// 1.排序sorted()
    sorted( (x,y)->pattern ):当pattern表达式为正数时,将x放在y后面。
例:
// 当x>y时,pattern为正数,x放在y后面,所以 升序。
list.stream().sorted( (x,y) -> x-y ).Collect(Collectors.toList()); 
// 当x<y时,pattern为正数,x放在y后面,所以 降序。
list.stream().sorted( (x,y) -> y-x ).Collect(Collectors.toList()); 

2.2 过滤去重

    filter( x->pattern ) // 当x使得pattern表达式的值为true时,数据x会保留下来。
例:
// 去重并保留偶数
list.stream().distinct().filter(e -> e % 2 == 0).collect(Collectors.toList());

2.3 groupingBy()分组,并对分组后的数据处理

/**
    算子处理过程的逻辑:对于类型为T的数据流,按照定义的分组逻辑,获取对应的键值对集合Map。Map集合的key类型为分组键值的类型,Map集合的value为数据流原始类型T的集合List<T>。之后经过 value() 方法处理Map,得到Map中的所有value组成的集合List< List<T> >。之后经过map()以及自定义函数getSum,对List< List<T> >内部的List集合进行求和处理,得到 List< int >,并通过foreach输出。
*/
使用示例:
需求:将list数组中的元素按照奇偶分别求和。
// 定义分组逻辑
public static Function<Integer, String> GROUP_KEY = e -> e%2==0? "偶数":"奇数";

// 需求第一种实现:输出结果需要用到分组的键值key
Map<String, List<Integer>> keyedList = list.stream().collect(Collector.groupingBy(GROUP_KEY));

keyedList.foreach( (k,v) -> {
    int sum = v.stream().maptoInt(Integer:intValue).sum();
    System.out.println(k + ": " + sum);
} )

// 需求第二种实现:只需要分组的value,不需要分组的键值key
list.stream().collect(Collector.groupingBy(GROUP_KEY)).value().stream().map(MainClass::geetSum).map(e->e+", ").foreach(System.out:print);
// 第二种实现,需要自定义map处理集合的逻辑
public static int getSum(List<Integer>) {
    // ... 对集合元素的求和逻辑 ...
}

 

2.4 聚合reduce

// 获取数据流的聚合结果
int sum = list.stream().reduce((a,b) -> a+b).get();

 

2.5 匹配

// 全部匹配:流中的每个数据都要符合规则
boolean allMatch = list.stream().allMatch(i -> Pattern);

// 任意匹配:流中 有一个 符合规则的数据即可
boolean anyMatch = list.stream().anyMatch(i -> Pattern);

// 完全不匹配:流中的所有数据都不符合规则
boolean noneMatch = list.stream().noneMatch(i -> Pattern);

 

2.6 结束流(转为 集合、数组、截取前几个元素等)

// 对每个元素调用方法并结束流。
list.stream().foreach( function );

// 转换为 Object列表,Object[]。
list.stream().toArray();

// 截取流的 前5个 元素,并转化为集合输出
list.stream().limit( x ).collect(Collectors.toList());

 

posted @ 2024-03-03 15:38  橘子葡萄火龙果  阅读(407)  评论(0编辑  收藏  举报