java8的stream_Java8中的Stream详解

java8已经发布相当长一段时间了,我工作中一直维护的几个项目发布在很多环境中,我也不敢保证每个环境的JDK都是1.8版本以上的,也就一直没在工作中使用java8的一些新特性

java8刚发布时我学习了一下,写了一些demo,没有及时的进行归档,现在这些demo基本都已经找不到了。在工作中每每遇到对集合进行一些操作时都很头疼,只能不停的对集合进行for循环,有时还需要对同一个集合循环两次以上,不仅效率不高,还浪费服务器资源,数据量大时还可能内存溢出

痛定思痛,我还是决定把学而又忘的java8的新特性进行重新的梳理和学习,本文主要讲如何利用stream对集合进行一系列的操作,包括排序、取最大值、过滤等

没有过多的文字描述,直接上代码。以下代码中的每个方法都可以单独拿出来运行,方便在实际工作中的快速使用

package com.helianxiaowu.java8;

import org.junit.Test;

import java.util.Arrays;

import java.util.List;

import java.util.stream.Collectors;

/**

* @title java8的集合stream操作详解

* @desc

* @author helianxiaowu

* @date 2020/2/1 23:20

*/

public class StreamDemo {

/**

* 获取集合中的最大值或最小值

*/

@Test

public void testMaxAndMin(){

List list = Arrays.asList(1, -1, 2, -2);

Integer max = list.stream().max((i, j) -> Integer.compare(i, j)).get();

Integer min = list.stream().min((i, j) -> Integer.compare(i, j)).get();

System.out.printf("max=%s, min=%s", max, min); // max=2, min=-2

}

/**

* 排序

*/

@Test

public void testSorted() {

List list = Arrays.asList(1, 4, 3, 2);

// 正序排序

List sortedList1 = list.stream().sorted().collect(Collectors.toList());

System.out.printf("sortedList1=%s%n", sortedList1);// sortedList1=[1, 2, 3, 4]

// 倒序排序

List sortedList2 = list.stream().sorted((i, j)-> Long.compare(j, i)).collect(Collectors.toList());

System.out.printf("sortedList2=%s", sortedList2);// sortedList2=[4, 3, 2, 1]

}

/**

* 使用map可以访问list中的元素的某些属性或方法

*/

@Test

public void testMap() {

List list = Arrays.asList("a", "java", "helianxiaowu");

// 获取list中的字符串的长度

List mapList = list.stream().map(String::length).collect(Collectors.toList());

System.out.printf("mapList=%s%n", mapList); // mapList=[1, 4, 12]

}

/**

* 滤重

*/

@Test

public void testDistinct() {

List list = Arrays.asList(1, 2, 2, 3, 3, 3);

List distinctList = list.stream().distinct().collect(Collectors.toList());

System.out.printf("distinctList=%s", distinctList); // distinctList=[1, 2, 3]

}

/**

* limit可以取出集合中的前n个元素

*/

@Test

public void testLimit() {

List list = Arrays.asList(1, 2, 3, 4, 5, 6);

// 取出前3个元素

List limitList = list.stream().limit(3).collect(Collectors.toList());

System.out.printf("limitList=%s", limitList); // limitList=[1, 2, 3]

}

/**

* skip可以去除list中的前n个元素,与limit相反作用

*/

@Test

public void testSkip() {

List list = Arrays.asList(1, 2, 3, 4, 5, 6);

// 去除list中的前3个元素

List skipList = list.stream().skip(3).collect(Collectors.toList());

System.out.printf("skipList=%s", skipList); // skipList=[4, 5, 6]

}

/**

* 根据条件过滤集合中的元素

*/

@Test

public void testFilter() {

List list = Arrays.asList(1, 2, 3, 4, 5, 6);

// 过滤能被2整除的元素

List filterList = list.stream().filter(i -> i%2==0).collect(Collectors.toList());

System.out.printf("filterList=%s", filterList); // filterList=[2, 4, 6]

}

/**

* 聚合

*/

@Test

public void testReduce() {

List list = Arrays.asList(1, 2, 3, 4);

// 计算list中所有元素的乘积

Integer integer = list.stream().reduce((i, j) -> i * j).get();

System.out.printf("integer=%s", integer); // integer=24

}

/**

* 匹配

* anyMatch 集合中的元素有一个满足条件就返回true

* allMatch 集合中的元素全部满足条件返回true

* noneMatch 集合中的元素都不满足条件返回true

*/

@Test

public void testMatch() {

List list = Arrays.asList(1, 2, 3, 4);

// list中有没有大于等于4的元素

boolean b1 = list.stream().anyMatch(i -> i >= 4);

System.out.printf("b1=%s%n", b1);// b1=true

// list中的元素是否全部大于4

boolean b2 = list.stream().allMatch(i -> i > 4);

System.out.printf("b2=%s%n", b2); // b2=false

// list中的元素是否没有大于4的

boolean b3 = list.stream().noneMatch(i -> i > 4);

System.out.printf("b3=%s", b3);// b3=true

}

}

stream使用起来如此方便,或许你会关心它的性能到底如何。可以参考相关的性能测试数据,结论是stream的性能无需担心

微信搜索赫连小伍关注我的公众号,文章不定期推送

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值