gpt4 book ai didi

java - 如何使用java 8流查找字符串中的第一个重复字符而无需中间终端操作

转载 作者:行者123 更新时间:2023-12-01 19:53:16 33 4
gpt4 key购买 nike

I used the below example code only to illustrate the problem with Java 8 stream API. I am not expecting workaround to the given code but the explanation why accumulator function is not possible/provided in Stream.

我想获取字符串中的第一个重复字符,而不使用中间终端操作或使用 Java 8 Stream api 的共享突变。我可以用 RxJava scan operator 来做到这一点无痛。 扫描/累加器基本上使我能够获取流中的前一个元素,并且我能够返回我自己的类型作为扫描中的前一个元素。我看到 Java 8 流没有任何可能性,但想知道为什么?在 Stream 中实现扫描/累加器操作有什么问题?

实现此目的的解决方法存在问题:

  1. 如果我使用终端操作,那么我的所有输入都会被处理,这是不必要的

  2. 如果我使用变异,则代码无法并行化,或者如果有人使用stream.parallel,则会带来更多问题。

给定 - String str = "rtydydret";

输出 - y - 因为 y 是字符串中的第一个重复字符。

实现此目的的必要示例:-

List<Character> list = new ArrayList<>();

for (char charecter : str.toCharArray()) {
if (list.contains(charecter)) {
System.out.println(charecter);
break;
} else {
list.add(charecter);
}
}

我也不想使用下面的代码,因为它使用终端操作,这意味着它处理了字符串中的所有字符,这很糟糕。

Map<Character, Long> collect =  "abcsdnvs".chars().mapToObj(i -> (char)i).collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));
collect.forEach( (x,y) -> System.out.println( "Key: " + x + " Val: " + y));

Optional<Character> firstRepeat = collect.entrySet().stream().filter( (e) -> e.getValue() > 1).map(e -> e.getKey()).findFirst();
System.out.println("First repeating:" + firstRepeat.orElse(null));

任何见解都会非常有帮助。谢谢。

最佳答案

I see there are no possibilities with Java 8 stream but wanted to know why?

因为这会使语言,特别是带有流的部分,以及映射/过滤/归约,比现在更复杂。

而且,考虑到您可以毫无问题地实现它,而无需使用流。这是语言的复杂性和它带来或不带来的便利性之间的权衡。

关于java - 如何使用java 8流查找字符串中的第一个重复字符而无需中间终端操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525839/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com