Java8之后的Stream流操作

什么是 Stream 流?

简单来说,我们可以使用 java.util.Stream 对一个包含一个或多个元素的集合做各种操作。这些操作可能是 中间操作 亦或是 终端操作。 终端操作会返回一个结果,而中间操作会返回一个 Stream 流。

需要注意的是,你只能对实现了 java.util.Collection 接口的类做流的操作。


stream 是支持顺序(stream())和并行(parallelStream())的。顺序流操作是单线程操作,而并行流是通过多线程来处理的,能够充分利用物理机 多核 CPU 的优势,同时处理速度更快。

推荐在数据量大且硬件配置够的时候使用并行流,在普通情况下使用顺序流就可以了


本次介绍一下stream的几个功能实现点

  • Filter过滤
  • Sorted排序
  • Map转换
  • Collect组装集合操作
  • Match匹配
  • Count计数

首先先定义本次的测试数据结构

package streamTest;

/**
 * @author huizhou
 * @date 21/11/11
 * @Description TODO
 */
public class DataTest {
    private Integer id;
    private String name;
    private String addr;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public DataTest() {
    }

    public DataTest(Integer id, String name, String addr) {
        this.id = id;
        this.name = name;
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "DataTest{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

以下是对数据的初始化

				List<DataTest> list = new ArrayList<>();
        for (int i = 0; i < 10; i++){
            DataTest dataTest = new DataTest();
            dataTest.setId(i);
            dataTest.setName("test"+i);
            dataTest.setAddr("hanzhou"+i);
            list.add(dataTest);
        }

Filter过滤

关于filter()操作,它是一个断言的中间操作 (ps: 中间操作指的是我们可以对其返回值继续进行操作,而对应的终端操作返回的是void我们就不能继续操作下去了),它的作用是帮我们筛选出需要的集合元素。

public static void filterTest(List<DataTest> list){
        list
                .stream()
                .filter((data) -> data.getId() >= 5)
                .forEach(System.out::println);
    }

对应输出结果

DataTest{id=5, name='test5', addr='hanzhou5'}
DataTest{id=6, name='test6', addr='hanzhou6'}
DataTest{id=7, name='test7', addr='hanzhou7'}
DataTest{id=8, name='test8', addr='hanzhou8'}
DataTest{id=9, name='test9', addr='hanzhou9'}

Sorted排序

sorted() 同样也是中间操作。 可以传入一个 comparator 来自定义排序

public static void sortedTest(List<DataTest> list){
        list
                .stream()
                .sorted((a,b) -> b.getId() - a.getId())
                .forEach(System.out::println);
    }public static void mapTest(List<DataTest> list){
        list
                .stream()
                .map(archive -> test1TurnTOTest2(archive))
                .forEach(System.out::println);
    }

    public static void collectTest(List<DataTest> list){
        final Map<Integer, String> collect = list
                .stream()
                .collect(Collectors.toMap(DataTest::getId, DataTest::getName));
    }

输出结果

DataTest{id=9, name='test9', addr='hanzhou9'}
DataTest{id=8, name='test8', addr='hanzhou8'}
DataTest{id=7, name='test7', addr='hanzhou7'}
DataTest{id=6, name='test6', addr='hanzhou6'}
DataTest{id=5, name='test5', addr='hanzhou5'}
DataTest{id=4, name='test4', addr='hanzhou4'}
DataTest{id=3, name='test3', addr='hanzhou3'}
DataTest{id=2, name='test2', addr='hanzhou2'}
DataTest{id=1, name='test1', addr='hanzhou1'}
DataTest{id=0, name='test0', addr='hanzhou0'}

Map 转换

同上map()也是一个中间操作,其作用是将 一个对象转换成另一个对象

		public static void mapTest(List<DataTest> list){
        list.stream()
                .map(archive -> test1TurnTOTest2(archive))
                .forEach(System.out::println);
    }

    public static DataTest2 test1TurnTOTest2(DataTest dataTest){
        DataTest2 dataTest2 = new DataTest2();
        dataTest2.setId(dataTest.getId());
        dataTest2.setName(dataTest.getName());
        return dataTest2;
    }

输出结果

DataTest2{id=0, name='test0'}
DataTest2{id=1, name='test1'}
DataTest2{id=2, name='test2'}
DataTest2{id=3, name='test3'}
DataTest2{id=4, name='test4'}
DataTest2{id=5, name='test5'}
DataTest2{id=6, name='test6'}
DataTest2{id=7, name='test7'}
DataTest2{id=8, name='test8'}
DataTest2{id=9, name='test9'}

Collect组装集合操作

collect() 此操作是一个终端操作,功能是将流组装成集合。

	public static void collectTest(List<DataTest> list){
        final Map<Integer, String> collect = list
                .stream()
								//collect中可以使用 Collectors转换不同的对象
                .collect(Collectors.toMap(DataTest::getId, DataTest::getName));
    }

Match匹配

match() 也是一个终端操作,用来匹配其中是否有符合要求的元素,返回的值为 boolean类型。

其中有 anyMatch() 包含任意一个 allMatch() 所有的都包含 noneMatch() 所有的都不包含

public static void matchTest(List<DataTest> list){
        Boolean flag = list
                .stream()
                .anyMatch((data) -> data.getId() == 29);
        System.out.printf(flag+"");
    }

输出为 false

Count计数

match() 也是一个终端操作,统计流中的元素个数,返回的值为 long类型。可以配合其它的方法使用,如filer()

public static void countTest(List<DataTest> list){
        long count = list
                .stream()
                .filter((data) -> data.getId() >= 5)
                .count();
        System.out.printf("conut=" + count);
    }

以上就是个人觉得stream中用的比较多的方法,在之后的学习中可能还会补充

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8中的Stream API支持通过`flatMap`方法来实现的复合操作。这个方法可以将一个中的每个元素转换成另一个,然后将这些合并成一个。在此基础上,可以进行更多的中间操作和终端操作。 下面是一个示例代码,演示了如何使用Stream的复合: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamDemo { public static void main(String[] args) { List<String> words = Arrays.asList("hello", "world", "java"); List<String> letters = words.stream() .flatMap(word -> Arrays.stream(word.split(""))) .distinct() .sorted() .collect(Collectors.toList()); System.out.println(letters); } } ``` 在这个示例代码中,我们首先定义了一个字符串列表`words`。接着,我们使用`flatMap`方法将这个列表中的每个字符串都转换成一个字符,并将这些字符合并成一个。然后,我们对这个进行了去重、排序等操作,并将结果收集到了一个新的列表中。 运行这段代码,输出结果为: ``` [a, d, e, h, j, l, o, r, w] ``` 这个结果是将原来列表中的所有字符去重、排序后得到的结果。 需要注意的是,`flatMap`方法返回的是一个新的,因此可以继续进行后续的操作。同时,由于`flatMap`方法需要将一个元素转换成一个,因此需要传入一个函数作为参数。这个函数的返回值必须是一个。 ### 回答2: Java 8引入了Stream API,使得我们可以更方便地对集合和数组进行处理和操作Stream API提供了一种操作的方式,可以实现数据的筛选、转换、排序等功能。 Java 8中的Stream API支持通过多种方式创建,如通过集合对象的stream()方法、Arrays类的stream()方法、Stream类的of()方法等。在创建了之后,我们可以通过一系列的中间操作和终端操作进行操作。 复合是指通过多个操作的组合来实现更复杂的操作Java 8中可以使用多个中间操作来构建一个水线操作。例如,我们可以先对数据进行筛选,然后对筛选后的数据进行映射处理,接着再进行排序等。这种操作可以通过链式调用来实现,每个中间操作都返回一个新的对象,可以继续对其进行下一步操作。 常见的中间操作有filter、mapflatMap、distinct等,用于对中的元素进行过滤、映射、扁平化等操作。而终端操作主要用于触发的执行,如forEach、collect、reduce等,用于获取中的结果或将结果收集到一个集合中。 通过复合的使用,我们可以更简洁地实现复杂的数据操作,减少了对临时变量和循环的依赖,使得代码更易读、更易维护。但需要注意的是,是一次性的,即一旦对进行了终端操作,就不可再对其进行其他操作。因此,在使用操作时要谨慎选择合适的中间和终端操作,以避免产生不必要的计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值