java8流式操作、stream

简介: java8流式操作、stream

引言

前面小猿总结了下java8中的新特新---Lambda表达式,不熟悉的小伙伴可以查看,这篇文章会用到lambda部分知识

这里小猿将介绍另一大java8引入的语法特性---Stream(流操作)

要知道什么是流式操作(Stream)操作,首先介绍一些什么是流操作,这里通过一个小小的案例看看流操作

//定义一个entity类Person
public class Person {
  private String name;
  private int age;
  public String getName() {
    return name;
  }
  //这里修改返回类型为Person
  public Person setName(String name) {
    this.name = name;
    return this;
  }
  public int getAge() {
    return age;
  }
       //这里修改返回类型为Person
  public Person setAge(int age) {
    this.age = age;
    return this;
  }
  public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
  }
  public Person() {
    
  }
  @Override
  public String toString() {
    return "Person [name=" + name + ", age=" + age + "]";
  }
  
}

关键代码

public class Demo {
  public static void main(String[] args) {
    Person person = new Person();
    person.setName("李四").setAge(16);
  }
}

通过上面代码我们可以分析当设置完姓名李四之后,我们还能接着设置年龄,这种用上一个过程的结果接着做另一件事的操作就是流操作。也就是说流只是一个计算的过程,并不会存储源对象,下面详细看看流式操作。

Stream实现步骤

1.获取数据源

                // 方式一:java8对collection集合的接口扩展,支持创建流
    List<String> list = new ArrayList<>();
    Stream<String> stream = list.stream();// 返回一个顺序流
    Stream<String> stream2 = list.parallelStream();// 返回一个并行流
    // 方式二:通过Arrays静态方法Stream
    Person[] person = new Person[10];
    Stream<Person> stream3 = Arrays.stream(person);
    // 方式三:通过stream的静态方法.of
    Stream<String> stream4 = Stream.of("aa", "bb");
    // 方式四:无限流
    // 使用iterate创建无限流 0, (x)->x+2中0表示种子,可以查看源码
    Stream<Integer> stream5 = Stream.iterate(0, (x) -> x + 2);
    // 使用生成创建无限流,使用generate,比如生成随机数流
    Stream.generate(()->Math.random());

2.对数据进行处理(过滤 映射)每一步得到一个流,成为中间操作

// 首创建一个集合流
List<Person> persons = Arrays.asList(
new Person("李四", 12),new Person("张三", 15),
new Person("网二", 18),new Person("王哈", 28),new Person("网二", 18));
Stream<Person> pStream = persons.stream();

筛选与切片

主要API

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

distinct() 筛选,通过流所生成元素的hashCode() 和 equals() 去 除重复元素 (需要重写对象得hashcode和equals方法)

limit(long maxSize) 截断流,使其元素不超过给定数量。

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

//演示filter(Predicate p)和distinct()API,查询年龄大于15,去重的人的信息
pStream.filter((x) -> x.getAge() > 15)
  .distinct()
  .forEach(System.out::println);

结果

Person [name=网二, age=18]

Person [name=王哈, age=28]

映射

主要的API

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

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

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

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

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

// 演示map(Function f) 将所有的person年龄+2
pStream.map((p)->p.getAge()+2).forEach(System.out::println);

排序

主要API

   sorted() 产生一个新流,其中按自然顺序排序

   sorted(Comparator comp) 产生一个新流,其中按比较器顺序排序

//创建一个流
List<String> list = Arrays.asList("aaa","bbb","ccc","dd");
//自然排序
list.stream().sorted().forEach(System.out::println);
// 首创建一个集合流
List<Person> persons = Arrays.asList(
  new Person("李四", 12), new Person("张三", 15), new Person("网二", 18),
        new Person("王哈", 28), new Person("张二", 18));
  persons.stream().sorted((a, b) -> {
    if (a.getAge() == b.getAge()) {
      return a.getName().compareTo(b.getName());
    } else {
      return a.getAge() - b.getAge();
    }
  }).forEach(System.out::println);

3.对流中数据的整合(转成集合 数量),对流中的数据做了整合,称为最终操作

主要API

allMatch(Predicate p) 检查是否匹配所有元素

anyMatch(Predicate p) 检查是否至少匹配一个元素

noneMatch(Predicate p) 检查是否没有匹配所有元素

findFirst() 返回第一个元素

findAny() 返回当前流中的任意元素

// 首创建一个集合流
List<Person> persons = Arrays.asList(
new Person("李四", 12), 
new Person("张三", 15), 
new Person("网二", 18),
new Person("王哈", 28),
new Person("张二", 18));
//演示取得第一个流
Optional<Person> pOptional = persons.stream().findFirst();
System.out.println(pOptional.get());//Person [name=李四, age=12]

 


相关文章
|
3月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
3月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
254 100
|
3月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
286 101
|
3月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
250 101
|
4月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
372 188
|
4月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
284 92
|
2月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
186 1
|
5月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
402 80
|
5月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
298 83
|
3月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
Java Stream API 的强大功能