歡迎來到 Java 8 Stream API 教程. 在最近的 java 8 帖子中,我們研究了 [Java 8 Interface Changes](/community/tutorials/java-8-interface-changes-static-method-default-method Java 8 Interface Changes – static methods, default methods, functional Interfaces
)和 [Functional Interfaces and Lambda Expressions](/community/tutorials/java-8-functional-interfaces Java 8 Lambda Expressions and Functional Interfaces Example Tutorial
)。
Java 8 流程
- 联合国 [Java 8 Stream] (# stream-overview)
- [Collections and Java Stream] (# stream-collections)
- [Java 8 Stream中的功能界面] (#功能界面) ( ) 1. [功能和双功能] (#功能-功能)
- [正和双功能] (#正和双功能) . 3. [消费者和双消费者] (#消费者-双消费者) (- ) 4. [供应者] (#供应商) (- )4. [java.util.optional] (#java.util.optional) (- ) 5. [java.util.spliterator] (#java.util.spliterator) (-). )6. [Java流中站和终端运营] (#流-中站-终端运营) ( (英语). 7. [Java流短路接通操作] (#流-短路接通操作) ( (英语). 8. [贾瓦流实例] (#java-stream-examples)
- [创建爪哇流 (#创建-流)
- [将爪哇流转换为集合或阵列] (#流-到集合-阵列)
- [贾瓦流中间操作] (#流-中间操作)
- [Java流终端运营] (#流-地铁运营)
- [Java 8 Stream API 限制] (# stream-api 限制)
Java 流程
在我们研究 Java Stream API 示例之前,让我们看看为什么它是必要的,假设我们想要重复整数列表,并找出大于 10 的整数的总和。
1private static int sumIterator(List<Integer> list) {
2 Iterator<Integer> it = list.iterator();
3 int sum = 0;
4 while (it.hasNext()) {
5 int num = it.next();
6 if (num > 10) {
7 sum += num;
8 }
9 }
10 return sum;
11}
上述方法有三大问题:
我们只是想知道整数的总和,但我们也必须提供迭代将如何发生,这也被称为外部迭代
,因为客户端程序正在处理在列表上迭代的算法
。
为了克服上述所有缺点,引入了Java 8 Stream API,我们可以使用Java Stream API来实现 内部迭代,这是更好的,因为Java框架控制了迭代。 内部迭代提供了几个功能,如连续和并行执行,基于给定的标准过滤,地图等。
1private static int sumStream(List<Integer> list) {
2 return list.stream().filter(i -> i > 10).mapToInt(i -> i).sum();
3}
请注意,上述程序使用 Java Framework 迭代策略、过滤和绘制方法,并将提高效率。首先,我们将研究 Java 8 Stream API 的核心概念,然后我们将通过一些示例来了解最常用的方法。
收藏和Java流
收集是一种内存数据结构,用于持有值,在我们开始使用收集之前,所有值都应该被覆盖. Java Stream是一个按需计算的数据结构。 Java Stream不存储数据,它运行在源数据结构(收集与阵列)上,并生成可使用和进行特定操作的被管道数据. 这样我们就可以从列表中创建出流并基于条件过滤. Java Stream操作使用功能接口,这使得它非常适合使用lambda表达式进行功能编程. 如上例所示,使用Lambda表达式使我们的代码可读而简短。 爪哇语 8流出内部迭接原则有助于在一些流出业务中实现寻懒. 例如过滤,映射,或重复去除可以被懒惰地执行,从而可以提高性能和优化范围. 爪哇语 流是可消耗的,所以没有办法为未来使用创建流的参考. 由于数据是按需的,因此不可能多次再用同流. 爪哇语 8 串流支持相继进行以及并行处理,并行处理对于实现大型收藏的高性能非常有帮助. Java Stream API的所有接口和类都是"java.util.stream"包. 由于我们可以使用原始数据类型,例如:int,长期使用自动箱收集,而且这些操作可能需要很多时间,因此对于原始类型有特定的类别----IntStream',
LongStream'和`DoubleStream'.
Java 8 Stream 中的功能接口
Java 8 Stream API 方法中常用的某些功能界面是:
- 功能和双功能:函数代表一个函数,它需要一种类型的参数,返回另一种类型的参数.
功能<T,R>
'是通用形式,其中T是函数输入的类型,R是函数结果的类型. 处理原始类型时,有特定的函数界面 -- --入行 ' 、
入行 ' 、入行 ' 、
入行 ' 、入行 ' 、
入行 ' 、入行 ' 、
入行 ' 、入行 ' 等。 使用
功能'或它原始专业化的Stream方法有: -Stream 地图(功能<?) 超级 T, ? extend R> mapper
- IntStream map ToInt( To IntFunction) < ? Super T > mapper) - 类似地用于长而双还原的原始特定流. ( ) - IntStream平面MapToInt(功能 < ? Super T,? extend IntStream > mapper) - 类似长相和双相
- 至Array(IntFunction <A[]>生成器)
- U还原(U身份, BiFunction <U,? Super T, U> 累积器, 二进取器 联合器
- ** 上游和上游**:它是测试溪流要素的上游。 用于从java流过滤元素. 与
功能 ' 一样,有原始的具体接口,用于直指、长相和双相。 采用
先入为主 ' 或`先入为主 ' 专门化的一些流法是:
- Stream
filter(先入为主? 超级 T > 上游 - 布尔任意Match(预选 < ? 超级T > 上游
- 布尔所有Match(预选) < ? 超级T > 上游
- 布林诺马克(预选 < ? 超级T > 上游
- ** 消费者和消费者**: 它代表了接受单一输入参数而返回无结果的操作. 它可用于在java流的所有元素上进行一些动作. Java 8 Stream 方法中一些使用"消费者","BiContamer"或"原始的专业化界面"的方法是: (-
) - Stream
spee (Contamer <? 超级 T> 动作
- 对Each(消费者)无效? 超级T> action
- Every Ordered(消费者 < ? 超级T>动作
- ** Supplier**:供应商代表一种业务,我们可以通过这一业务在流中产生新的值。 采用 " Suppers " 参数的一些Stream方法是:
- 公共静态
Stream 生成(Suppers s) 收集(Suppers 供应商,BiCummer <R,?超级T>累积器,BiCummer <R,R>联合器
java.util. 可选
Java Optional 是一个容器对象,它可能或可能不包含非 null 值. 如果存在一个值,则 isPresent()
将返回 true,而 get()
将返回该值。
- 可选
减少(二进制操作员 电池) - 可选
min(比较<?超级T> 比较器) - 可选
max(比较<?超级T> 比较器) - 可选
findFirst() - 可选
findAny()
java.util.散布器
用于支持Java 8 Stream API中的并行执行,使用Spliterator
接口。SpliteratortrySplit
方法返回一个新的Spliterator,该方法管理原始Spliterator元素的子集。
Java Stream 中间和终端操作
返回新流的Java Stream API操作被称为中间操作,大多数情况下,这些操作在性质上都是懒惰的,所以他们开始生成新流元素,并将其发送到下一个操作中。中间操作从来不是最终结果产生的操作。常用的中间操作是过滤
和地图
。Java 8 Stream API操作返回结果或产生副作用。一旦终端方法被调用到流上,它消耗了流量,然后我们无法使用流量。终端操作在性质上很渴望,即他们在返回结果之前处理流中的所有元素。常用的终端方法是Eforach
,Array
,min
,max
,FindFirst
,Matchany
,Matchall
等。你可以从返回类型中识别终
Java Stream 短循环操作
一个中间操作被称为短电路,如果它可以为无限电路产生有限电流. 例如,‘limit()’和‘skip()’是两个短电路中间操作. 一个终端操作被称为短电路,如果它可以在无限电路的有限时间中终止。
Java流的例子
我已经涵盖了Java 8流API的几乎所有重要部分,使用这个新的API功能令人兴奋,让我们用一些Java流示例来展示它。
创建 Java 流程
有几种方式,我们可以从数组和集合创建一个Java流,让我们用简单的例子来看看这些。
- 联合国 我们可以使用`Stream.of ()'来创建来自类似类型数据的流。 例如,我们可以从一组整数对象或整数对象创建Java Stream的整数. (_) ) QQ 流取出"整流" = stream.of (1,2,3,4); QQ
- 我们可以使用 " Stream.of () " 和一系列对象返回溪流。 注意它不支持自动箱,所以不能通过原始类型阵列. ( ) QQ 流线"整数" stream = Stream.of(新整数 []{1,2,3,4})); / works fine
Stream<整数> stream1 = Stream.of (新入 []{1,2,3,4}) ;
//编译时间出错, 类型不匹配: 无法从 Stream
//sequentific stream 流 < Iteger> 顺序 Stream = myList.stream ();
//相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 我们可以使用'Stream.generate ()'和'Stream.iterate ()'方法来创建Stream. (-
)(-
) Stream
将Java Stream转换为集合或数组
有几种方法可以从 java 流中获取集合或数组。
我们可以使用 Java 流量 collect() 方法来从流量中获取列表、地图或设置 `` 流量<Integer> intStream = Stream.of(1,2,3,4); 流量<Integer> intList = intStream.collect(1,2,3,4);所以我们需要重新创建它 System.outprintln(intList); //prints [1, 2, 3, 4] (i, i+10)); Stream = Stream.Ar
_Ar_Ar
_Arger K```Ar1____output.K1(M1K,M1K,M1K,M1K,M1
Java Stream 中间操作
让我们来看看常用的Java Stream中间操作的例子。
- 联合国 ** Stream () 示例** : 我们可以使用过滤器()方法测试某一条件的流元素并生成被过滤过的列表.
QQ
List
myList = new ArrayList _ ( (); for (int i=0; i<100; i<100; i++) myList.add(i); Stream 顺序 Stream = myList.stream (); (- ) Stream * : 我们可以使用映射来将函数应用到流中 。 让我们看看如何用它来将上大小写函数应用到 Strings 列表中去( ) QQ Stream < String > names = Stream.of ("aBc","d","ef"); (- ) system.out.println (names.map (s-) { ) 返回 s.toUpperCase (; ).collectors.toList ()); (- )/prints [ABC, D, EF] Q高Nums = 相继Stream.filter(p- > p > 90); // filter数字大于90(- ) System.out.print("高数值大于90="); (- ) highNums.forEach(p- > system.out.print(p+")"); (- )/print "高数值大于90=91 92 93 94 95 97 98 "(- ) Q(- ) 2. ** Stream () 地图实例 - ** Stream 排序实例**: 我们可以使用排序( ) 来通过 Comparator 参数排序流元素 。 (_)
) QQ
Stream
names 2 = stream.of ("aBc","d","ef","123456"); List 反向Sorted = names2. streamed (Compator.reversion Order ()) 收集(Collectors.toList ()); system.out.println (reversionSort); (/ [ef, d, aBc, 123456] stream stream3 = stream.of ("aBc", "d", "ef", "123456"); List 天然Sorted = namesetlecollec.toList (.collecol.toList ()) 收集 system.println (NaturalSort (Sort) ;/[123456, aBc, d, ef] Q( () ** Stream平地Map( ) 例 **: 我们可以使用平地Map( ) 从列表的流中创建流 。 让我们举个简单的例子来澄清这个疑问。
Stream <List <String___________ 原文 List = stream.of (
Arrays.asList ("Pankaj"), (-
) Arrays.asList ("大卫","Lisa"), (-
) Arrays.asList ("Amit")); (-
)/将流从List
Java Stream 终端操作
让我们来看看一些Java流终端操作的例子。
- 联合国 ** 结构减小()实例**: 我们可以使用减()来对流中的元素进行减(),使用关联积累函数,并返回可选功能. 让我们看看如何用它来乘以流中的整数。 ( ) QQ 流取取出"整数" = stream.of (1,2,3,4,5) (- ) 可选取出"整数" = 数字. reduc((一,j) - > { return i*j;} (- ) 如果(可选取出.ispresent ()) system.out.println ("乘法"="+intoptional.get ()"); /120
12. ** 结构计数( ) 实例**: 我们可以使用这个终端操作来计算流中项目的数量.
2QQ
3Stream < Integer> number 1 = Stream.of (1,2,3,4,5)
4
5System.out.println ("流中元素数量="+数字1.count ()"); //5
6QQ
73. ** Each( ) 的Stream 示例** : 这可用于在溪流上行走. 我们可以用这个来代替旅行者 让我们看看如何用它来打印溪流的所有元素. (_ MKBR1_) QQ
8Stream < 整数 > 数字2 = Stream.of (1,2,3,4,5)
9数字2. forEach(一) - > (中文) system.out.print(一+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ** Stream 匹配实例**: 让我们看看Stream API中一些匹配方法的例子( _) MKBR1_) QQ
10Stream < Iteger > number3 = Stream.of (1,2,3,4,5);
11System.out.println ("Stream 包含 4?" + 数字3. AnyMatch(i- > i==4));
12//Stream 包含 4? 真
13
14Stream < Iteger > 数字 4 = stream.of (1,2,3,4,5)
15System.out.println ("Stream 包含所有小于10个元素? "+数字4.allMatch(i- > i<10)"); (_ MKBR1_) //史特兰包含所有小于10的元素? true
16
17Stream < 整数 > 数字 5 = stream.of (1,2,3,4,5);
18System.out.println ("Stream 不包含 10?) " + 数字5. noneMatch(i - > i==10)";
19. //史克威尔不包含 10? true
20QQ
215. ** Stream find First() 示例**: 这是一个短路终端操作,让我们看看如何用它从以 D.
22为起点的溪流中找到第一个字符串 {}
23Stream <String> names 4 = Stream.of ("Pankaj", Amit", David, "Lisa");
24可选的"String" 首先Name WithD = names 4. filter (i- > i.startsWith ("D")") find First ();
25如果(第一个NameWith.ispresent (){
26System.out.println (第一个以 D= +第一个NameWith.get ()起名) ; //大卫
27}
Java 8 流程 API 限制
Java 8 Stream API 带来了许多新东西来使用列表和数组,但它也有一些局限性。
- 联合国 ** 无状态羊肉表达式**: 如果使用平行流和羊肉表达式是状态的,则会导致随机响应. 让我们用一个简单的程序看看. 'Stream.java' (- ) com.journaldev.java8. stream; (- ) (- ) 导入java.util. arrayList; 导入java. util. arrays; 导入 java. util. 列表; 导入 java. util.stream. Stream; (- ) 公共类状态 Parallel Stream {(- ) (- ) 公共静态空白主干道(转接) {(- ) (- ) 列表 < Iteger > ss = Arrays.asList (1,2,3,4,5,6,7,9,10,11,12,13,14,15) ; (- ) 列表 < Iteger > 结果=新ArayList < Iteger > (-)
Stream
s. map (s- > { ) s. s. s. s. s. s. s. s. s. 如果我们使用相继流,那么这个问题就不会出现. 2. 一旦一串流被消耗,以后不能使用. 如上所举的例子所示,我每次创建一个流. 3. Stream API中有许多方法,最令人困惑的是超载的方法. 这使得学习曲线需要时间. (单位:千美元) (英语)
这就是Java 8流示例教程的全部。我期待着使用这个功能,并通过并行处理更好地读取代码。参考:Java Stream API Doc(LINK0)