java8 list切片_Java8-Stream-中间操作

注意:流一旦使用了终止操作流就关闭了,如果要继续使用同样的数据源,则需重新获取流

筛选与切片

filter(Predicate p) : 接收 Lambda , 从流中排除某些元素。

distinct()          : 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素,所以要根据实际情况编写这两个方法

limit(long maxSize) : 截断流,使其元素不超过给定数量。找到满足条件的数据就会终止内循环

skip(long n)        : 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补

sorted(comparator c): 对流中的元素进行排序

举例

List custs = Arrays.asList(

new Cust(101,"梅西",30,33000000L),

new Cust(102,"伊布",35,23000000L),

new Cust(103,"哈维",34,20000000L),

new Cust(104,"伊列斯塔",33,18000000L),

new Cust(105,"小罗",37,15000000L),

new Cust(106,"内马尔",27,32000000L),

new Cust(106,"内马尔",27,32000000L),

new Cust(106,"姆巴佩",23,30500000L)

);

public void test2() {

//找出工资排名前三位的不重复的人,且年龄要小于等于30

Stream sm1 = custs.stream();

sm1.filter((x)->x.getAge()<=30)

.sorted((x,y)->{

if(x.getSalary()>y.getSalary())

return 1;

else if(x.getSalary()

return 0;

else

return -1;

})

.distinct()

.limit(3)

.forEach(System.out::println);

System.out.println("######################");

//找出工资排名第二和第三位不重复的人,且年龄要小于等于30

Stream sm2 = custs.stream();

sm2.filter((x)->x.getAge()<=30)

.sorted((x,y)->{

if(x.getSalary()>y.getSalary())

return 1;

else if(x.getSalary()

return 0;

else

return -1;

})

.distinct()

.skip(1)

.limit(2)

.forEach(System.out::println);

}

真的好强大,以前要写多少代码才可以完成的事情,只需要一句就搞定。

filter((x)->x.getAge()<=30)

过滤年龄大于30的元素

sorted((x,y)->{

if(x.getSalary()>y.getSalary())

return 1;

else if(x.getSalary()

return 0;

else

return -1;

})

对过滤的结果按照工资降序排序

distinct()

对有序的结果集排重

limit(3)

只取结果集的前三个元素

foreach(System.out::println)

终止操作,使用方法引用(对象::实例方法名)打印出结果集

映射

map

map(Function f)                                 :接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

mapToDouble(ToDoubleFunction f)  :接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream。

mapToInt(ToIntFunction f)                 : 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream。

mapToLong(ToLongFunction f)          :接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream。

@Test

public void test3() {

//map类型:将每个元素经过处理转换成另外一个类型(可以是同类型)

List names = Arrays.asList("姚明","科比","乔丹","詹姆斯");

names.stream().map(Cust::new).forEach(System.out::println);

System.out.println("###################################");

List dbls = Arrays.asList("11","22","33","44");

dbls.stream().mapToDouble(Double::parseDouble).forEach(System.out::println);

System.out.println("###################################");

dbls.stream().mapToInt(Integer::parseInt).forEach(System.out::println);

System.out.println("###################################");

dbls.stream().mapToLong(Long::parseLong).forEach(System.out::println);

System.out.println("###################################");

}

flatMap

flatMap(Function f)                           : 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

同样还有flatMapToInt(),flatMapToLong(),flagMapToDouble(),用法和flatMap一致,只是要求最终处理出来的元素是对应的Int,Long,Double

@Test

public void test4() {

//flatMap类型:将为每个元素创建一个流,并最终合并成一个流

List lp = new ArrayList();

for(int i=0;i<3;i++) {

List lc = new ArrayList();

for(int j=0;j<10;j++) {

lc.add(Math.random());

}

lp.add(lc);

}

lp.stream().flatMap((x)->x.stream()).forEach(System.out::println);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值