JDK新特性——Stream代码简洁之道的详细用法 (2)

limit(n):返回由此流的元素组成的流,截短长度不能超过 n
skip(n):在丢弃流的第n元素后,配合limit(n)可实现分页

//打印20-30这样的集合数据 Stream.iterate(1,x->x+1).limit(50)// limit 50 总共到50 .skip(20)// 跳过前 20 .limit(10) // 打印10个 .forEach(System.out::println);//打印输出(21,22,23,24,25,26,27,28,29,30) 5. 转换

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

List<String> list = Arrays.asList("a,b,c", "1,2,3"); //将每个元素转成一个新的且不带逗号的元素 Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", "")); s1.forEach(System.out::println); // abc 123 Stream<String> s3 = list.stream().flatMap(s -> { //将每个元素转换成一个stream String[] split = s.split(","); Stream<String> s2 = Arrays.stream(split); return s2; }); s3.forEach(System.out::println); // a b c 1 2 3 6. 消费

peek:如同于map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。

//将str中的每一个数值都打印出来,同时算出最终的求和结果 String str ="11,22,33,44,55"; System.out.println(Stream.of(str.split(",")).peek(System.out::println).mapToInt(Integer::valueOf).sum());//11 22 33 44 55 165 5.2 终止操作 1. 循环:forEach

Users类:

import java.util.Date; /** * @program: lambda * @ClassName Users * @description: * @author: muxiaonong * @create: 2020-10-24 11:00 * @Version 1.0 **/ public class Users { private String name; public Users() {} /** * @param name */ public Users(String name) { this.name = name; } /** * @param name * @return */ public static Users build(String name){ Users u = new Users(); u.setName(name); return u; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "name='" + name + '\''; } } //创建一组自定义对象 String str2 = "java,scala,python"; Stream.of(str2.split(",")).map(x->new Users(x)).forEach(System.out::println);//打印输出(name='java') Stream.of(str2.split(",")).map(Users::new).forEach(System.out::println);//打印输出(name='java') Stream.of(str2.split(",")).map(x->Users.build(x)).forEach(System.out::println);//打印输出(name='java') Stream.of(str2.split(",")).map(Users::build).forEach(System.out::println);//打印输出(name='java') 2. 计算:min、max、count、sum

min:返回流中元素最小值
max:返回流中元素最大值
count:返回流中元素的总个数
sum:求和

//求集合中的最大值 List<Integer> list = Arrays.asList(1,2, 3,4, 5, 6); Optional<Integer> max = list.stream().max((a, b) -> a - b); System.out.println(max.get()); // 6 //求集合的最小值 System.out.println(list.stream().min((a, b) -> a-b).get()); // 1 //求集合的总个数 System.out.println(list.stream().count());//6 //求和 String str ="11,22,33,44,55"; System.out.println(Stream.of(str.split(",")).mapToInt(x -> Integer.valueOf(x)).sum()); System.out.println(Stream.of(str.split(",")).mapToInt(Integer::valueOf).sum()); System.out.println(Stream.of(str.split(",")).map(x -> Integer.valueOf(x)).mapToInt(x -> x).sum()); System.out.println(Stream.of(str.split(",")).map(Integer::valueOf).mapToInt(x -> x).sum()); 3. 匹配:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny

anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false
noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false
findFirst:返回流中第一个元素
findAny:返回流中的任意元素

List<Integer> list = Arrays.asList(1,2, 3,4, 5, 6); System.out.println(list.stream().allMatch(x -> x>=0)); //如果集合中的元素大于等于0 返回true System.out.println(list.stream().noneMatch(x -> x > 5));//如果集合中的元素有大于5的元素。返回false System.out.println(list.stream().anyMatch(x -> x > 4));//如果集合中有大于四4的元素,返回true //取第一个偶数 Optional<Integer> first = list.stream().filter(x -> x % 10 == 6).findFirst(); System.out.println(first.get());// 6 //任意取一个偶数 Optional<Integer> any = list.stream().filter(x -> x % 2 == 0).findAny(); System.out.println(any.get());// 2 4.收集器:toArray、collect

collect:接收一个Collector实例,将流中元素收集成另外一个数据结构
Collector<T, A, R> 是一个接口,有以下5个抽象方法:

Supplier<A> supplier();创建一个结果容器A

BiConsumer<A, T> accumulator();:消费型接口,第一个参数为容器A,第二个参数为流中元素T。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfxjd.html