Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
a1c24a72
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a1c24a72
编写于
8月 12, 2013
作者:
B
briangoetz
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8019401: Collectors.collectingAndThen
Reviewed-by: mduigou Contributed-by: brian.goetz@oracle.com
上级
ccc6be9a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
0 deletion
+52
-0
src/share/classes/java/util/stream/Collectors.java
src/share/classes/java/util/stream/Collectors.java
+37
-0
test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java
...st/org/openjdk/tests/java/util/stream/TabulatorsTest.java
+15
-0
未找到文件。
src/share/classes/java/util/stream/Collectors.java
浏览文件 @
a1c24a72
...
@@ -353,6 +353,43 @@ public final class Collectors {
...
@@ -353,6 +353,43 @@ public final class Collectors {
downstream
.
characteristics
());
downstream
.
characteristics
());
}
}
/**
* Adapts a {@code Collector} to perform an additional finishing
* transformation. For example, one could adapt the {@link #toList()}
* collector to always produce an immutable list with:
* <pre>{@code
* List<String> people
* = people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));
* }</pre>
*
* @param <T> the type of the input elements
* @param <A> intermediate accumulation type of the downstream collector
* @param <R> result type of the downstream collector
* @param <RR> result type of the resulting collector
* @param downstream a collector
* @param finisher a function to be applied to the final result of the downstream collector
* @return a collector which performs the action of the downstream collector,
* followed by an additional finishing step
*/
public
static
<
T
,
A
,
R
,
RR
>
Collector
<
T
,
A
,
RR
>
collectingAndThen
(
Collector
<
T
,
A
,
R
>
downstream
,
Function
<
R
,
RR
>
finisher
)
{
Set
<
Collector
.
Characteristics
>
characteristics
=
downstream
.
characteristics
();
if
(
characteristics
.
contains
(
Collector
.
Characteristics
.
IDENTITY_FINISH
))
{
if
(
characteristics
.
size
()
==
1
)
characteristics
=
Collectors
.
CH_NOID
;
else
{
characteristics
=
EnumSet
.
copyOf
(
characteristics
);
characteristics
.
remove
(
Collector
.
Characteristics
.
IDENTITY_FINISH
);
characteristics
=
Collections
.
unmodifiableSet
(
characteristics
);
}
}
return
new
CollectorImpl
<>(
downstream
.
supplier
(),
downstream
.
accumulator
(),
downstream
.
combiner
(),
downstream
.
finisher
().
andThen
(
finisher
),
characteristics
);
}
/**
/**
* Returns a {@code Collector} accepting elements of type {@code T} that
* Returns a {@code Collector} accepting elements of type {@code T} that
* counts the number of input elements. If no elements are present, the
* counts the number of input elements. If no elements are present, the
...
...
test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java
浏览文件 @
a1c24a72
...
@@ -25,6 +25,7 @@ package org.openjdk.tests.java.util.stream;
...
@@ -25,6 +25,7 @@ package org.openjdk.tests.java.util.stream;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.Collection
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Comparator
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.HashSet
;
...
@@ -52,6 +53,7 @@ import java.util.stream.TestData;
...
@@ -52,6 +53,7 @@ import java.util.stream.TestData;
import
org.testng.annotations.Test
;
import
org.testng.annotations.Test
;
import
static
java
.
util
.
stream
.
Collectors
.
collectingAndThen
;
import
static
java
.
util
.
stream
.
Collectors
.
groupingBy
;
import
static
java
.
util
.
stream
.
Collectors
.
groupingBy
;
import
static
java
.
util
.
stream
.
Collectors
.
groupingByConcurrent
;
import
static
java
.
util
.
stream
.
Collectors
.
groupingByConcurrent
;
import
static
java
.
util
.
stream
.
Collectors
.
partitioningBy
;
import
static
java
.
util
.
stream
.
Collectors
.
partitioningBy
;
...
@@ -603,4 +605,17 @@ public class TabulatorsTest extends OpTestCase {
...
@@ -603,4 +605,17 @@ public class TabulatorsTest extends OpTestCase {
new
PartitionAssertion
<>(
classifier
,
new
PartitionAssertion
<>(
classifier
,
new
ReduceAssertion
<>(
0
,
LambdaTestHelpers
.
identity
(),
Integer:
:
sum
)));
new
ReduceAssertion
<>(
0
,
LambdaTestHelpers
.
identity
(),
Integer:
:
sum
)));
}
}
@Test
(
dataProvider
=
"StreamTestData<Integer>"
,
dataProviderClass
=
StreamTestDataProvider
.
class
)
public
void
testComposeFinisher
(
String
name
,
TestData
.
OfRef
<
Integer
>
data
)
throws
ReflectiveOperationException
{
List
<
Integer
>
asList
=
exerciseTerminalOps
(
data
,
s
->
s
.
collect
(
toList
()));
List
<
Integer
>
asImmutableList
=
exerciseTerminalOps
(
data
,
s
->
s
.
collect
(
collectingAndThen
(
toList
(),
Collections:
:
unmodifiableList
)));
assertEquals
(
asList
,
asImmutableList
);
try
{
asImmutableList
.
add
(
0
);
fail
(
"Expecting immutable result"
);
}
catch
(
UnsupportedOperationException
ignored
)
{
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录