为了账号安全,请及时绑定邮箱和手机立即绑定

用于计算唯一对象的 Java lambda 表达式

用于计算唯一对象的 Java lambda 表达式

慕尼黑5688855 2022-06-04 15:34:51
我已经在下面设置了这个流,并且不能在 .map 上使用方法 count()。仅在过滤器上。但我没有设置任何过滤条件。我怎么能在下面这个流的字符串数组上做到这一点?我想根据 replaceAll 中的正则表达式对字符串进行排序,并获取唯一字符串并获取唯一字符串的总数。Stream newStream = Arrays.stream(arr)                     .map(s -> s.replaceAll("[^a-z]", ""))                     .distinct()
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

如果要计算distinct字符串的数量,可以这样做:

long countDistinct = Arrays.stream(arr)
        .map(s -> s.replaceAll("[^a-z]", ""))
        .distinct() // intermediate operation with unique strings as 'Stream' return type
        .count();   // terminal operation with count of such strings as return type


查看完整回答
反对 回复 2022-06-04
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我不确定我是否完全理解您的要求。List在将正则表达式应用于数组的每个元素之后,您似乎想要对不同的字符串进行排序。这List将同时具有元素及其计数:

List<String> list = Arrays.stream(arr)
    .map(s -> s.replaceAll("[^a-z]", ""))
    .distinct()
    .sorted()
    .collect(Collectors.toList());

现在,list持有元素。如果您还想知道它包含多少元素,只需使用以下List.size方法:

int count = list.size();

编辑:如果您还需要Stream更改字符串、唯一和排序的字符串,只需创建一个新Stream的 from list

Stream<String> newStream = list.stream();


查看完整回答
反对 回复 2022-06-04
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

以列表形式收集和获取总数都是终端操作,因此您只能在实时流中执行任一操作。


如果您必须使用相同的流来获取字符串列表和计数,一个(hacky)选项是使用Supplier<Stream<T>>:


String text = "FOO bar BAZ TEXT text some";

String[] arr = text.split(" ");


Supplier<Stream<String>> sameStream = () -> Arrays.stream(arr)

        .map(s -> s.replaceAll("[^a-z]", ""))

        .distinct()

        .filter(s -> !s.isEmpty())

        .sorted();


System.out.println("Unique strings are: " + sameStream.get().collect(Collectors.toList()));

System.out.println("Count of Unique strings are: " + sameStream.get().count());

上面产生了这个输出:


Unique strings are: [bar, some, text]

Count of Unique strings are: 3


查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号