如何使用 Lambda 在字符串列表的某些元素中进行子字符串操作

8
以下是我的字符串列表。
["sunday", "monday", "tuesday", "wednesday", "thurs", "fri", "satur"]

我想要从元素中删除以“day”结尾的"day"。

列表中的预期输出:

["sun", "mon", "tues", "wednes", "thurs", "fri", "satur"]
如何使用Lambda实现这个功能?

我尝试了下面的代码,但无法将值分配给列表:

daysList.stream().forEach(s -> {
    if (s.endsWith("day")) {
        s = s.substring(0, s.indexOf("day"));
    }
});

如何在末尾替换day为空,即将String#replaceAll("day$", "")应用于所有元素。这只是一个解决条件的想法。如果您不能将更改后的元素写回列表(我还不太了解该API,但“forEach”表明不可能),您可以将它们收集到新列表中。 - Thomas
为什么不用for循环直接迭代列表呢? - wero
@Thanigaiarasu 我已经做了同样的事情,你可以在问题中看到。我的问题是,在这个操作之后,我的列表应该没有“day”元素。 - Pavan
1
@wero 因为他想知道如何使用lambda来实现这个? - Tomas
4个回答

16

这里的大多数回答都使用了Stream,但你根本不应该使用Stream:

daysList.replaceAll(s -> s.replaceFirst("day$", ""));

8

使用 forEach 迭代流不起作用;您需要使用 map 将修改过的每个元素映射到新流中。然后,您可以将结果收集回您的列表。

daysList = daysList.stream()
        .map(s -> s.endsWith("day") ? s.substring(0, s.length()-3) : s)
        .collect(Collectors.toList());

有趣,我的解决方案看起来和你的一样 :D。所以我不需要发布它。 - Tom
我认为你的s.substring(0, s.indexOf("day"))最好改写成s.substring(0, s.length()-3);这样你就不会冒着在字符串中遇到早期出现的“day”的风险。 - khelwood
@khelwood 或者更好的是 lastIndexOf。但还是谢谢你提醒我。 - TNT
@TNT 更好的做法是什么?你只是在执行一次额外的搜索,而你已经知道了结果。 - khelwood
@khelwood 你说得有道理。我在考虑可读性方面,是否更容易注意到子字符串范围以"day"的最后一次出现的索引结束。但像你说的那样,这已经是已知的了,似乎那也是更好的解决办法。 - TNT

1
List<String> daysList = Arrays.asList("sunday", "monday", 
                                      "tuesday", "wednesday",
                                       "fri", "satur" 
                                      );


List<String> res = daysList.stream()
                            .map(s -> s.replace("day",""))
                            .collect(Collectors.toList());

1

带小数点的子字符串排序

String arr[]= {"2.4","4.2","3.1","5.7","3.0","2.01","7.06","6.003"};

List newList =Arrays.asList(arr); newList.stream().map(n -> n.substring(n.indexOf('.')) ).collect(Collectors.toList()).stream().sorted().forEach(n -> System.out.println(n));;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接