Java JDK1.8 Stream

 使用

集合条件筛选。

提供了一种对 Java 集合运算和表达的高阶抽象,类似于SQL查询。

可以在List中匹配所需的对象,并且存储到新的List中。

以下是查找年龄小于24的对象:

import lombok.Data;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author QZP
 * Created on 2024/4/17$
 */
public class streamTest {
    public static void main(String[] args) {
        Student s1 = new Student("邱泽鹏", 24, 1);
        Student s2 = new Student("qzp", 26, 1);
        List<Student> list_Student = new ArrayList<>();
        list_Student.add(s1);
        list_Student.add(s2);
//        打印:年龄:24, 姓名:邱泽鹏, 性别:1
//        年龄:26,姓名:qzp, 性别:1
        for(Student s_iter:list_Student){
            System.out.println(s_iter.toString());
        }
        // s可以理解为Student类型的一个对象,会在list_Student中循环。
        List<Student> StudentList = list_Student.stream().filter(s->s.getAge()<=24).collect(Collectors.toList());

//        打印:年龄:24, 姓名:邱泽鹏, 性别:1
        for(Student s_iter:StudentList){
            System.out.println(s_iter.toString());
        }

    }

}

@Data
class Student{
    String name;
    int age;
    int sex;

    public Student(String name, int age, int sex) {
        this.age=age;
        this.name=name;
        this.sex=sex;
    }
    @Override
    public String toString(){
        return String.format("年龄:%s, 姓名:%s, 性别:%s", age, name, sex);
    }

}

原理

参考自:https://github.com/CarpenterLee/JavaLambdaInternals/blob/master/4-Streams%20API(I).md

 stream不是一种数据结构,而是数据源(数组、Java容器、I/O channel)的一种视图。其思想是以一种更友好的方式,实现简洁的代码。

无存储:stream不存储数据,对其修改都不会修改数据源(比如对其不符合的数据进行过滤)。

一次性:stream是一次性的,遍历完结束就会失效。这跟迭代器一样。

惰性:stream中的操作不会立即执行,只有当用户需要结果时再执行。这与触发类加载相似。

方法

转变

想使用stream的API需要将数据转变为Stream类型。JDK8提供了.stream()进行转变。

.collect(Collectors.toList()),同样可以传递:

Collectors.toList() | .toSet()等等。

stream本质还是用于迭代筛选。对应的方法可以分为两类,一是筛选的中间过程,而是结束操作

中间操作concat() distinct() filter() flatMap() limit() map() peek()
skip() sorted() parallel() sequential() unordered()
结束操作allMatch() anyMatch() collect() count() findAny() findFirst()
forEach() forEachOrdered() max() min() noneMatch() reduce() toArray() 

forEach:stream可以使用forEach方法进行遍历。Lambda表达式使其代码更加简洁。

public class streamTestMethod {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("Qiu", "Ze", "peng");
        stream.forEach(str -> System.out.println(str));
    }
}

filter:筛选器。作用是筛选出符合条件的对象。

public class streamTestMethod {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("Qiu", "Ze", "peng");
        stream.filter(str->str.length()==2).forEach(str -> System.out.println(str));
        // output: Ze
    }
}

distinct:去重

public class streamTestMethod {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("Qiu", "Ze", "peng", "Ze");
        stream.distinct().forEach(str -> System.out.println(str));
        // output: Qiu
        //Ze
        //peng
    }
}

sorted():排序

其中 str1.length()-str2.length()代表按降序排序。

Stream<String> stream= Stream.of("I", "love", "you", "too");
stream.sorted((str1, str2) -> str1.length()-str2.length())
    .forEach(str -> System.out.println(str));

map():转换

如果相对数据进行处理,需要使用map进行转换。

Stream<String> stream = Stream.of("I", "love", "you", "too");
stream.map(str -> str.toUpperCase())
    .forEach(str -> System.out.println(str));

flatMap():将多个list合并成一个。

————————————待续

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值