假设我有一个Java IntStream,是否可以将其转换为具有累积总和的IntStream?例如,以[4,2,6,...]开头的流应转换为[4,6,12,...].
更一般地说,应该如何实现有状态流操作?感觉这应该是可能的:
myIntStream.map(new Function<Integer, Integer> {
int sum = 0;
Integer apply(Integer value){
return sum += value;
}
);
Run Code Online (Sandbox Code Playgroud)
有明显的限制,这只适用于顺序流.但是,Stream.map明确需要无状态映射函数.我是否正确错过了Stream.statefulMap或Stream.cumulative操作,还是缺少Java流的重点?
比较一下Haskell,其中scanl1函数正好解决了这个例子:
scanl1 (+) [1 2 3 4] = [1 3 6 10]
Run Code Online (Sandbox Code Playgroud) 在阅读了https://www.airpair.com/java/posts/spring-streams-memory-efficiency之后,我很想从数据库中传出结果,但正如我与同事讨论的那样(cfr.评论他补充说文章),需要记住使用try-with-resources构造来避免任何内存泄漏.
我想以一种由线条组成的方式将InputStream isa 转换为Stream<String> stream给定的a .此外,不应立即读取一行,但仅在需要时才读取.Charset csstreamisisstream
我非常喜欢Java 8流和Guava的不可变集合,但我无法弄清楚如何将两者结合使用.
例如,如何实现将流结果收集到ImmutableMultimap中的Java 8 Collector?
加分点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式.
所以我有一组对象,它们的步长变量可以是1到4.
public class MyClass {
private Long step;
//other variables, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)
Collection<MyClass> myOjbects = /*get collection*/;
然后我想MyClass从集合中获得具有最大步长值的一个实例,所以我这样做:
final Optional<MyClass> objectWithMaxStep =
myObjects.stream().max(Comparator.comparing(MyClass::getStep));
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况MyClass下,集合中将有多个实例,其步长等于4.
所以,我的问题是,如何确定返回哪个实例Optional,或者当流中的多个对象具有要比较的最大值时是否抛出异常?
该max()函数的Java 8文档未指定在这种情况下将发生的情况.
我有兴趣将一个流分成两个或多个子流,并以不同的方式处理这些元素.例如,(大)文本文件可能包含类型A的行和类型B的行,在这种情况下,我想要执行以下操作:
File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))
Run Code Online (Sandbox Code Playgroud)
以前是我试图抽象的情况.实际上我有一个非常大的文本文件,其中每一行都在测试正则表达式; 如果该行通过,则处理它,而如果它被拒绝,那么我想更新一个计数器.对拒绝字符串的进一步处理是我不仅仅使用的原因filter.
是否有任何合理的方法可以使用流来执行此操作,还是必须回退到循环?(我希望这也是并行运行,所以溪流是我的第一选择).
如何在不区分大小写的顺序中对字符串值进行排序?
List<Employee> listofEmployees = Arrays.asList(
new Employee(1, "aaa", Arrays.asList(123, 345, 678)),
new Employee(1, "bbb", Arrays.asList(91011, 121314, 1516117)),
new Employee(2, "ccc", Arrays.asList(181920, 212223, 242526)),
new Employee(3, "ddd", Arrays.asList(272829, 303132, 333435)),
new Employee(4, "BBB", Arrays.asList(29, 332, 33))
);
Run Code Online (Sandbox Code Playgroud)
我写的是这样的:
listofEmployees.stream().sorted(Comparator.comparing(Employee::getName).reversed())
.forEach(s -> System.out.println(s.getName()));
Run Code Online (Sandbox Code Playgroud)
如何在此处传递字符串不区分大小写的选项?
如何使用java流查找列表中的第一个匹配项或最后一个元素?
这意味着如果没有元素匹配条件,则返回最后一个元素.
例如:
OptionalInt i = IntStream.rangeClosed(1,5)
.filter(x-> x == 7)
.findFirst();
System.out.print(i.getAsInt());
Run Code Online (Sandbox Code Playgroud)
我该怎么办才能让它返回5;
我有一个Map<String, String>和一个List<String>.我想Map根据条件进行分区
foreach(map.key -> list.contains(map.key))
Run Code Online (Sandbox Code Playgroud)
并产生两个Map.最优雅的方式是什么?我在Java 11上,所以你可以在答案中抛出你想要的一切.
我现在要做的是:
map.entrySet()
.stream()
.collect(partitioningBy(e -> list.contains(o.getKey())));
Run Code Online (Sandbox Code Playgroud)
但这给了一个Map<Boolean, List<Entry<String, String>>>.
我试图了解该reduce()方法如何在java-8中工作。
例如,我有以下代码:
public class App {
public static void main(String[] args) {
String[] arr = {"lorem", "ipsum", "sit", "amet"};
List<String> strs = Arrays.asList(arr);
int ijk = strs.stream().reduce(0,
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a * b;
});
System.out.println(ijk);
}
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
Accumulator, a = 0, b = lorem
Accumulator, a = 5, b = …Run Code Online (Sandbox Code Playgroud)