标签: java-stream

流状态计算:累积总和

假设我有一个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)

java java-8 java-stream

21
推荐指数
2
解决办法
5056
查看次数

为什么在发出终端操作后没有Java close()流?

在阅读了https://www.airpair.com/java/posts/spring-streams-memory-efficiency之后,我很想从数据库中传出结果,但正如我与同事讨论的那样(cfr.评论他补充说文章),需要记住使用try-with-resources构造来避免任何内存泄漏.

  1. 为什么Java 8库不会在每次终端操作后自行关闭流(不必在try-with-resources中包装流实例化)?
  2. 如果适用,是否有任何将此功能添加到Java的计划,或者请求它是否有意义?

java java-8 java-stream

21
推荐指数
1
解决办法
2041
查看次数

在给定Charset的情况下将InputStream转换为Stream <String>

我想以一种由线条组成的方式将InputStream isa 转换为Stream<String> stream给定的a .此外,不应立即读取一行,但仅在需要时才读取.Charset csstreamisisstream

java io stream java-8 java-stream

21
推荐指数
1
解决办法
9813
查看次数

用于Guava不可变集合的Java 8收集器?

我非常喜欢Java 8流和Guava的不可变集合,但我无法弄清楚如何将两者结合使用.

例如,如何实现将流结果收集到ImmutableMultimap中的Java 8 Collector?

加分点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式.

java guava java-stream

21
推荐指数
3
解决办法
5591
查看次数

Java 8 Stream - .max()带有重复项

所以我有一组对象,它们的步长变量可以是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文档未指定在这种情况下将发生的情况.

java java-8 java-stream

21
推荐指数
2
解决办法
5781
查看次数

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.

是否有任何合理的方法可以使用流来执行此操作,还是必须回退到循环?(我希望这也是并行运行,所以溪流是我的第一选择).

java java-8 java-stream

21
推荐指数
3
解决办法
4万
查看次数

在Java 8中以不区分大小写的方式对字符串值进行排序

如何在不区分大小写的顺序中对字符串值进行排序?

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 java-8 java-stream

21
推荐指数
3
解决办法
8554
查看次数

java流找到匹配还是最后一个?

如何使用java流查找列表中的第一个匹配项或最后一个元素?

这意味着如果没有元素匹配条件,则返回最后一个元素.

例如:

OptionalInt i = IntStream.rangeClosed(1,5)
                         .filter(x-> x == 7)
                         .findFirst();
System.out.print(i.getAsInt());
Run Code Online (Sandbox Code Playgroud)

我该怎么办才能让它返回5;

java lambda list java-8 java-stream

21
推荐指数
3
解决办法
1670
查看次数

用Java 8+对Map进行分区

我有一个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>>>.

java java-stream

21
推荐指数
5
解决办法
2241
查看次数

reduce()方法在Java 8中如何工作?

我试图了解该reduce()方法如何在。

例如,我有以下代码:

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)

java reduce java-8 java-stream

21
推荐指数
4
解决办法
1739
查看次数

标签 统计

java ×10

java-stream ×10

java-8 ×8

guava ×1

io ×1

lambda ×1

list ×1

reduce ×1

stream ×1