`
rensanning
  • 浏览: 3547905 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38135
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607258
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682255
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89316
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401790
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69685
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91691
社区版块
存档分类
最新评论

Java 8 之 流(Stream)

    博客分类:
  • Java
阅读更多
与java.io包里的InputStream和OutputStream是完全不同的概念,它是以数据流的形式来处理数据集合。

  • 不是collection,有点儿像iterator但没有存储
  • 仅代表数据流,并没有数据结构
  • 只能被遍历一次(返回另外一个Stream)。采用Lazy方式,如果有多个中间操作和最终操作,在调用最终操作的时候才会同时处理所有中间操作。
  • 不支持索引访问
  • 避免出现Null而影响到链式操作,引入了Optional.empty代表空。
  • 短路处理:只要有一个符合条件就终止遍历。善用短路处理也能提高效率,比如:stream.count() != 0 等价于 stream.findAny().isPresent()


Streams vs. Collections: What’s the difference?

两种模式
  • 顺序流sequential version
  • 并行流parallel version

***可以相互转换!

两种操作
  • 中间操作Intermediate operation
  • 终止操作Terminal operation


Stream类型
  • Stream<T>
  • IntStream、LongStream、DoubleStream


链式写法
数据源(集合、数组等).中间操作(过滤、投影等).....终止操作(forEach、reduce等)
***可以没有中间操作。

一个简单的例子
List<String> apples = fruits.stream()
  .filter(f -> f.getName().startsWith("Apple"))
  .filter(f -> f.getPrice() > 10)
  .sorted(Comparator.comparingInt(Fruit::getPrice))
  .map(Fruit:getName)
  .collect(Collectors.toList());

// Line 1:从所有水果一览中
// Line 2:把名字以“Apple”开头
// Line 3:价格高于10元的
// Line 4:按照价格升序排序
// Line 5:并只取出名字
// Line 6:的水果一览List


生成Stream
// Values
Stream<String> stream1 = Stream.of("a", "b", "c", "d", "e");

// Array
Object[] array = {"string", 1, new ArrayList<Integer>()};
Stream<Object> stream2 = Arrays.stream(array);
Stream<Object> stream3 = Stream.of(array);

// Collection
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream4 = list.stream();// sequential version
Stream<String> stream5 = list.parallelStream(); // parallel version

// Function
Stream<String> stream6 = Stream.generate(() -> "test").limit(5);
Stream<Integer> stream7 = Stream.iterate(10, i -> i + 10).limit(5);

// Stream.Builder
Stream.Builder<String> builder = Stream.builder();
builder.accept("foo");
builder.add("bar");
Stream<String> stream8 = builder.build();

// String
IntStream stream9 = "abcd".chars();

// Random
Random random = new Random();
IntStream stream10 = random.ints();

// Iterable
Iterable<String> iter = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream11 = StreamSupport.stream(iter.spliterator(), false);

// Stream + Stream
Stream<String> a = Stream.of("a", "b", "c");
Stream<String> b = Stream.of("d", "e");
Stream<String> stream12 = Stream.concat(a, b);

// Range Stream
IntStream stream13 = IntStream.range(2, 10);

// BufferedReader
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
Stream<String> stream14 = br.lines();


核心方法
过滤
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .filter(x -> x % 2 == 0);

投影
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .map(x -> x * 10);

一对多投影
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .flatMap(x -> IntStream.range(x * 10, x * 10 + x).boxed());

排序
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .sorted((x, y) -> y - x);

获取前N个元素
Stream.iterate(1, x-> x++)
  .limit(5);

跳过前N个元素
Stream.iterate(1, x-> x++)
  .skip(3)
  .limit(5);

连接
Stream.concat( Arrays.asList(1,2,3).stream(), 
               Arrays.asList(30,20,10).stream());

无重复
Arrays.asList(1,3,4,3,2,4).stream()
  .distinct();

自定义方法
int max = Arrays.asList(1,5,3,7,2,4).stream()
  .reduce(Integer.MIN_VALUE, (x, y) -> Math.max(x, y));
System.out.println(max);

分组
Arrays.asList("Sam", "Samuel", "Samu", "Ravi", "Ratna","Barsha").stream()
  .collect(Collectors.groupingBy(x -> x.length()))
  .entrySet().stream();

平均值
IntStream.range(0, 10).average().getAsDouble();
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .collect(Collectors.summarizingInt(x -> x))
  .getAverage();

件数
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .count();

最大值
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .max();

最小值
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .min();

合计
IntStream.range(0, 10).sum();
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .collect(Collectors.summarizingInt(x -> x))
  .getSum();

第一个元素
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .findFirst();

找到任何一个匹配的元素
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .findAny();

导出到某个容器
List<String> converted = Arrays.asList("foo", "foo bar").stream()
  .collect(Collectors.toList());

导出到数组
int[] arr = new Random().ints().limit(10).toArray();

是否所有的元素都匹配
boolean a = Arrays.asList(1, 3, 5, 7, 9).stream()
  .allMatch(c -> c % 3 == 0);

是否至少一个匹配的元素
boolean b = Arrays.asList(1, 3, 5, 7, 9).stream()
  .anyMatch(c -> c % 3 == 0);

是否所有的元素都不匹配
boolean c = Arrays.asList("foo", "foo bar").stream()
  .noneMatch(s -> s.startsWith("A"));

空序列
Stream.empty();

指定范围的序列
IntStream.range(0, 10);

通过函数生成
Stream.generate(() -> "test").limit(5).forEach(System.out::println);
Stream.generate(new Random()::nextInt).forEach(System.out::println);

无限循环
Stream.iterate(10, i -> i + 10)
 .limit(5)
 .forEach(System.out::println);

遍历序列
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
  .forEach(System.out::println);



http://java-latte.blogspot.jp/2014/03/stream-lambda-in-java-8.html
http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/
http://qiita.com/amay077/items/9d2941283c4a5f61f302
  • 大小: 27.5 KB
  • 大小: 100.9 KB
分享到:
评论

相关推荐

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    java8中stream流对List操作的一些测试方法

    java8中通过stream流对List类型进行一些操作的测试Demo类

    Java8 Stream学习

    - **基本类型的流**:对于int、long和double这些基本类型,Java8提供了专门的Stream实现:`IntStream`、`LongStream`和`DoubleStream`。 ```java IntStream intStream = IntStream.range(0, 10); // 生成0到9的...

    Java-Stream流详解.pptx.pptx

    Java Stream是Java 8引入的重要特性,它提供了一种声明式处理数据集合的方式,极大地提升了代码的可读性和性能。Stream允许程序员更加专注于业务逻辑,而不是底层数据处理的细节。 **1. Java Stream简介** Java ...

    Java8 Stream流的三个步骤操作.docx

    在Java 8中,Stream API引入了一种新的处理数据的方式,它允许我们以声明性风格对集合、数组等数据源进行高效的操作。Stream是数据渠道,它可以用来处理一系列元素,如从集合或数组中生成的元素序列。Stream操作通常...

    Stream_Java8.pdf

    Stream API作为Java 8的重要特性之一,极大地简化了集合处理的代码编写过程,提升了程序的可读性和效率。 ### Stream概述 Java 8引入的Stream API提供了一种更加高效且易于理解的方式来处理集合中的数据。它可以被...

    在java8以下使用StreamApi

    6. **并行处理的挑战**:Java 8的Stream API支持并行流,可以充分利用多核处理器的优势。在Java 8以下,如果想要实现并行处理,需要手动使用线程池或者并发工具,如`ExecutorService`和`Future`,这无疑增加了编码...

    Java8Test.java_java8_almosttog_stream流_

    Java 8是Java语言的一个重要版本,引入了许多新特性,其中Stream API是其最显著的改进之一。Stream API提供了一种新的数据处理方式,使得在集合上进行操作更加简洁、高效。本文将深入探讨Java 8 Stream API的基础...

    Java-IO流/Stream流总结

    Java的IO流与Stream流是Java程序中处理输入输出的核心技术。IO流主要分为字节流和字符流,这两种流分别处理二进制数据(如图片、音频等)和文本数据(如ASCII、UTF-8编码的文本)。下面将详细阐述这两个流的分类、...

    Java8特性Stream流的使用(学完就会,项目源码,附带个人总结)

    以下将详细介绍Stream流的使用,以及它在Java8中的重要性。 首先,Stream API是一种用于处理集合的新接口,它可以对集合进行各种操作,如过滤、映射、聚合等,而无需显式地遍历集合。这种处理方式称为“函数式编程...

    Java中的`java.util.stream.Collectors.toMap()`方法有什么作用

    Collectors.toMap()是Java 8 Stream API中一个非常实用的工具,它简化了将流中的元素收集到Map中的过程。通过本文的介绍,你应该能够理解Collectors.toMap()的工作原理,并能够在实际开发中灵活运用它。如果你有任何...

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据

    Java Stream 使用详解

    Stream是 Java 8新增加的类,用来补充集合类。  Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。  Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的数据的访问和有效管理...

    深入理解Java中的`java.util.stream.Collector`接口

    在Java 8引入的Stream API中,java.util.stream.Collector接口扮演着至关重要的角色。它不仅丰富了集合处理的方式,还提供了一种声明式的数据转换和汇总方法。本文将详细探讨Collector接口的工作原理、核心方法、...

    java1.8 中 stream 的 groupingBy 最大值、最小值分组

    主要是介绍在 JDK8中使用 stream 流的 groupingBy 方法源进行最大值分组、最小值分组、平均值分组、统计分组

    java8新特性(Stream,lambda等)

    Stream API是Java 8引入的一种处理数据的新概念,它提供了一种声明式编程风格,使得对集合数据进行过滤、映射和规约等操作更为简洁。Stream API可以用于处理任何数据源,如集合、数组、I/O通道甚至数据库查询结果。...

    Java Stream全面讲解

    Stream API首次在Java 8中引入,极大地提升了代码的简洁性和可读性。 Java中的Stream分为两种类型:InputStream和OutputStream,分别对应输入流和输出流。InputStream用于读取数据,而OutputStream则用于写入数据。...

    Java8新特性Stream流实例详解

    Java8新特性Stream流实例详解 Java 8 中引入了 Stream 流,用于操作数据源(集合、数组等)所生成的元素序列。Stream 流是数据渠道,具有声明性、可复合、可并行三个特性,使得 Stream 操作更简洁、更灵活、高效。...

    Java Stream 流实现合并操作示例

    Java Stream 流实现合并操作示例 Java Stream 流实现合并操作示例是 Java Stream Api 的一个重要应用场景。在实际开发中,我们经常需要将多个 Stream 流合并成一个流,以便进行后续的数据处理。今天,我们将详细...

Global site tag (gtag.js) - Google Analytics