Java Stream 使用

1. of()

of()接收数组并创建流,然后map()将每个元素都获取平方,distinct()去重,再使用collect()将流中的元素变成List

@Test
public void mapTest(){
    List<Integer> squaresList = Stream.of(3, 2, 2, 3, 7, 3, 5)
            .map(e -> e*e)
            .distinct()
            .collect(Collectors.toList());
}

2. filter()

Collection可使用stream()获取流,filter()过滤出空字符串,count()计数

@Test
public void filerTest(){
    List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
    long count = stringList.stream().filter(string -> string.isEmpty()).count();
    // 2
}

filter()过滤出非空字符串,skip()过滤掉前三个,并使用逗号间隔生成String

@Test
public void collectTest(){
    List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
    String mergedString = stringList.stream().filter(string -> !string.isEmpty()).skip(3).collect(Collectors.joining(", "));
    // ghi, 123, bcd
}

根据新旧两个List获取出新增和删除的数字

@Test
public void insertDeleteListTest() {
    List<Integer> newList = Arrays.asList(2,3,4,5);
    List<Integer> oldList = Arrays.asList(1,2,3,4);
	
	// 新增:循环新list,每个id去旧list中contain,没有存在就是新增的
    List<Integer> insertList = newList.stream().filter(id -> !oldList.contains(id)).collect(Collectors.toList());

	// 删除:循环旧list,每个id去新list中contain,没有存在就是删除
    List<Integer> deleteList = oldList.stream().filter(id -> !newList.contains(id)).collect(Collectors.toList());
}

3. IntSummaryStatistics

一些产生统计结果的收集器也非常有用。
它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

@Test
public void statTest(){
    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

    IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

    System.out.println("列表中最大的数 : " + stats.getMax());//7
    System.out.println("列表中最小的数 : " + stats.getMin());//2
    System.out.println("所有数之和 : " + stats.getSum());//25
    System.out.println("平均数 : " + stats.getAverage());//3.5714285714285716
}

4. parallelStream()

并行执行,顺序可能会与原来的顺序不同。
filter()过滤出非空字符串,limit()过滤出前两个

@Test
public void parallelStreamTest(){
    List<String> stringList = Arrays.asList("abc", "d", "ef", "ghi", "","123", "bcd","");
    stringList = stringList.parallelStream().filter(string -> !string.isEmpty()).limit(2).collect(Collectors.toList());
    // [abc, d]
}

5. concat()

合并两条未关闭的流,如果有个流先使用count(),collect()或forEach(),就会关闭流,那么合并时会报错
stream has already been operated upon or closed

@Test
public void concatTest(){
    Stream<Integer> stream1 = Stream.of(1,2,3);
    Stream<Integer> stream2 = Stream.of(4,5,6);

    // 4,5,6,
    Stream.concat(stream1, stream2).filter(e -> e > 3).forEach(e -> System.out.print(e + ","));
}

参考:
Java 8 Stream
Java 之 Stream 流
了解Java8中的parallelStream
Java8初体验(二)Stream语法详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java StreamJava 8 中新增的一个 API,用于处理集合数据。它提供了一种更加简洁、高效的方式来操作集合,可以让代码更加简洁、易读、易维护。下面是 Java Stream 的基本使用方法: 1. 创建流 Java Stream 可以从多种数据源中创建,比如集合、数组、文件等。例如,从集合创建一个 Stream 可以使用以下代码: ```java List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); ``` 2. 中间操作 中间操作是指对 Stream 进行操作,返回一个新的 Stream。常见的中间操作包括:filter、map、sorted、distinct 等。例如,下面的代码使用 filter 操作过滤出长度大于 5 的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); Stream<String> stream = list.stream().filter(s -> s.length() > 5); ``` 3. 终止操作 终止操作是指对 Stream 进行最终的操作,返回一个非 Stream 的结果。常见的终止操作包括:forEach、reduce、collect、count 等。例如,下面的代码使用 forEach 操作输出过滤后的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); list.stream().filter(s -> s.length() > 5).forEach(System.out::println); ``` 4. 短路操作 短路操作是指对 Stream 进行操作时,只要满足一定条件就可以停止操作,不必对整个流进行操作。常见的短路操作包括:findFirst、findAny、allMatch、anyMatch、noneMatch 等。例如,下面的代码使用 findAny 操作找到第一个长度大于 5 的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); Optional<String> result = list.stream().filter(s -> s.length() > 5).findAny(); ``` 以上就是 Java Stream 的基本使用方法,需要注意的是,Stream 是一次性的,一旦进行了终止操作,就不能再对该 Stream 进行操作。同时,Stream 也是惰性求值的,只有在终止操作时才会进行真正的计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值