我有一个由Java 8流表示的数据集:
Stream<T> stream = ...;
Run Code Online (Sandbox Code Playgroud)
我可以看到如何过滤它以获得随机子集 - 例如
Random r = new Random();
PrimitiveIterator.OfInt coin = r.ints(0, 2).iterator();
Stream<T> heads = stream.filter((x) -> (coin.nextInt() == 0));
Run Code Online (Sandbox Code Playgroud)
我还可以看到如何减少此流以获得,例如,两个列表代表数据集的两个随机半部分,然后将它们转换回流.但是,有没有直接的方法从最初的流生成两个流?就像是
(heads, tails) = stream.[some kind of split based on filter]
Run Code Online (Sandbox Code Playgroud)
感谢您的任何见解.
在Java 8的Streams中,我知道如何基于谓词过滤集合,并处理谓词为真的项目.我想知道的是,如果谓词将集合分成两组,是否可以通过API根据谓词进行过滤,处理过滤后的结果,然后立即链接调用以处理过滤器排除的所有元素?
例如,请考虑以下列表:
List<Integer> intList = Arrays.asList(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)
有可能做到:
intList.stream()
.filter(lessThanThree -> lessThanThree < 3)
.forEach(/* process */)
.exclusions(/* process exclusions */); //<-- obviously sudocode
Run Code Online (Sandbox Code Playgroud)
或者我是否必须只forEach对已过滤的项目执行此过程,然后调用stream()并filter()在原始列表上处理剩余的项目?
谢谢!
我正在学习Java8,想要使用Java8中的流API执行以下操作。
输入: (1,2,3,4,5,6,7,8,9) 列表
我可以在传统java中的单个for循环中执行此操作,例如
List<Integer> ints = Arrays.asList(3,4,2,5,6,7,4,5);
List<Integer> oddList = new ArrayList<>();
List<Integer> evenList = new ArrayList<>();
for (Integer i : ints) {
if (i % 2 == 0) {
evenList.add(i);
} else {
oddList.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道一种以 Java8 风格执行此操作的方法,如下所示 -
List<Integer> evens = ints.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
List<Integer> odds = ints.stream().filter(i -> i % 2 == 1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但这里的问题是我迭代了两次而不是一次整数。有没有一种方法可以做到这一点而无需在流中迭代两次?