Java 8 Stream API具体解释

Java 8 Stream API具体解释

一、Stream API介绍

Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是全然不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream。Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强。专注于对集合对象进行各种非常便捷、高效的聚合操作或大批量数据操作。

Stream API引入的目的在于弥补Java函数式编程的缺陷。对于非常多支持函数式编程的语言。map()、reduce()基本上都内置到语言的标准库中了。只是,Java 8的Stream API整体来讲仍然是非常完好和强大,足以用非常少的代码完毕很多复杂的功能。

Java 8的Stream API充分利用Lambda表达式的特性,极大的提高编程效率和程序可读性。

同一时候它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。

通常编写并行代码非常难并且easy出错。但使用Stream API无需编写一行多线程的代码。就能够非常方便地写出高性能的并发程序。

在Stream API中。一个流基本上代表一个元素序列,Stream API提供了丰富的操作函数来计算这些元素。曾经我们在开发业务应用时,通常非常多操作的实现是这样做的:我们使用循环对集合做遍历,针对集合中的元素实现各种操作,定义各种变量来实现目的,这样我们就得到了一大堆丑陋的顺序代码。

假设我们使用Stream API做相同的事情,使用Lambda表达式和其他函数进行抽象,能够使得代码更易于理解、更为干净。有了这些抽象,还能够做一些优化,比方实现并行等。

二、Stream API实例

1. 使用IntStream移除常规的循环

比方在控制台输出0~9的样例:

注意需import java.util.stream.IntStream;

IntStream.range(0, 10).forEach(value -> System.out.println(value));

2. 计算列表中的元素数

注意需

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

List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());
System.out.println(list.stream().count());

3. 计算列表中元素的平均数

Double avarage = list.stream().collect(Collectors.averagingInt(item -> item));

4. 对列表元素进行统计

List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());
IntSummaryStatistics iss = list.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println(iss);

?

输出结果:

IntSummaryStatistics{count=99, sum=4950, min=1, average=50.000000, max=99}

5. 依据List创建Map

List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());
Map<Integer, Integer> map = list.stream().collect(Collectors.toMap(p -> p, q->q*3));
System.out.println(map);

输出结果:

{1=3, 2=6, 3=9, 4=12, 5=15, 6=18, 7=21, 8=24, 9=27, 10=30, 11=33, 12=36, 13=39, 14=42, 15=45, 16=48, 17=51, 18=54, 19=57, 20=60, 21=63, 22=66, 23=69, 24=72, 25=75, 26=78, 27=81, 28=84, 29=87, 30=90, 31=93, 32=96, 33=99, 34=102, 35=105, 36=108, 37=111, 38=114, 39=117, 40=120, 41=123, 42=126, 43=129, 44=132, 45=135, 46=138, 47=141, 48=144, 49=147, 50=150, 51=153, 52=156, 53=159, 54=162, 55=165, 56=168, 57=171, 58=174, 59=177, 60=180, 61=183, 62=186, 63=189, 64=192, 65=195, 66=198, 67=201, 68=204, 69=207, 70=210, 71=213, 72=216, 73=219, 74=222, 75=225, 76=228, 77=231, 78=234, 79=237, 80=240, 81=243, 82=246, 83=249, 84=252, 85=255, 86=258, 87=261, 88=264, 89=267, 90=270, 91=273, 92=276, 93=279, 94=282, 95=285, 96=288, 97=291, 98=294, 99=297}

6. 求列表元素的最大数

List<Integer> list = new Random().ints(-100,100).limit(250).boxed().collect(Collectors.toList());
Optional<Integer> max = list.stream().reduce(Math::max);
max.ifPresent(value -> System.out.println(value));

7. 从一堆姓名列表中找出以字母“C”开头的姓名

?String[] names = { "Fred Edwards", "Anna Cox", "Deborah Patterson", "Ruth Torres", "Shawn Powell",
                "Rose Thompson", "Rachel Barnes", "Eugene Ramirez", "Earl Flores", "Janice Reed", "Sarah Miller",
                "Patricia Kelly", "Carl Hall", "Craig Wright", "Martha Phillips", "Thomas Howard", "Steve Martinez",
                "Diana Bailey", "Kathleen Hughes", "Russell Anderson", "Theresa Perry" };
List<String> ls = Arrays.asList(names).stream().filter(s -> s.startsWith("C")).collect(Collectors.toList());
System.out.println(ls.toString());

8. 把全部的姓名大写、排序。再输出

String[] names = { "Fred Edwards", "Anna Cox", "Deborah Patterson", "Ruth Torres", "Shawn Powell",
                "Rose Thompson", "Rachel Barnes", "Eugene Ramirez", "Earl Flores", "Janice Reed", "Sarah Miller",
                "Patricia Kelly", "Carl Hall", "Craig Wright", "Martha Phillips", "Thomas Howard", "Steve Martinez",
                "Diana Bailey", "Kathleen Hughes", "Russell Anderson", "Theresa Perry" };
Arrays.asList(names)
         .stream()
         .map(String::toUpperCase)
         .sorted().forEach(System.out::println);

三、更复杂的样例

1. 创建一个Person类

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name;
    }
}

2. 依据年龄对Person进行分组

Map<Integer, List<Person>> collect = persons.stream().collect(Collectors.groupingBy(Person::getAge));

3. 对全部Person求平均年龄

Double collect = persons.stream().collect(Collectors.averagingInt(Person::getAge));
时间: 2024-11-05 17:19:32

Java 8 Stream API具体解释的相关文章

Java 8 Stream API详解

Java 8 Stream API详解 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数据操

Java 8 : Stream API 练习

//店铺属性类 public class Property { String name; // 距离,单位:米 Integer distance; // 销量,月售 Integer sales; // 价格,这里简单起见就写一个级别代表价格段 Integer priceLevel; public Property(String name, int distance, int sales, int priceLevel) { this.name = name; this.distance = di

Java 8新特性之旅:使用Stream API处理集合

在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda表达式增强方法”中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组创建流. 聚合流中的值. 1.

Java 8: Lambdas和新的集合Stream API

Lambda是Java8的主要特色,Java 8: Lambdas & Java Collections | zeroturnaround.com一文介绍了使用Lambda集合处理大量数据的方法. 首先Java集合引入了内部遍历,原来 LambdaJ下面这种方法也可以在Java8中实现: List<Person> persons = asList(new Person("Joe"), new Person("Jim"), new Person(&

Atitit 实现java的linq 以及与stream api的比较

1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1.3. Java中的linq1 Linq来源于sql,而我们知道在数据查询领域,sql是标准化的一个dsl.. 1.1. Linq 和stream api的关系,以及主要优缺点 Stream更加的通用化,linq比较专一化,专注于数据查询的dsl..Linq就是特殊化的stream.. 此外,linq更加的dsl ,更加方便简洁.. stream相对底层一些,更加灵活,但

Upgrading to Java 8——第四章 The Stream API

在这章中我们将学习Stream API,在JDK 8 中的一项新的特性.为了理解这一章的主题,你需要知道如何使用Lambda表达式和java.util.function里的预定义的函数式接口. 一个Stream 类似于一个管道,但它里面运输的不是水和石油,而是把数据从源头运输到目的地.根据传递的方式,一个stream可以是并行和并发的.并行的stream运行在多核的CPU的机器上会很有用. 乍一看,一个stream就像是一个集合容器,但是,它不是一个数据结构用来存储对象,它只是负责移动对象,所以

Java 8新特性:全新的Stream API

Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. Stream API引入的目的在于弥补Java函数式编程的缺陷.对于很多支持函数式编程的语言,map().reduce()基本上都内置到语言的标准库中了,不过,Java 8的Stream API总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能. 创建一个Stream有很多方法,最简单的方法是把一个Collection变成Stream.我们

Java 8新特性之使用Stream API处理集合

1. 使用流来遍历集合 简介: Java的集合框架,如List和Map接口及Arraylist和HashMap类,让我们很容易地管理有序和无序集合.集合框架自引入的第一天起就在 持续的改进.在Java SE 8中,我们可以通过流的API来管理.遍历和聚合集合.一个基于流的集合与输入输出流是不同的. 如何工作? 它采用一种全新的方式,将数据作为一个整体,而不是单独的个体来处理.当你使用流时,你不需要关心循环或遍历的细节.你可以直接从一个集合创建一个流.然 后你就能用这个流来许多事件了,如遍历.过滤

Java 8新特性stream API用法总结

前言 Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data