首页 > 解决方案 > java - 如何替换Java列表列表中的单词?

问题描述

我有一个列表列表,如下所示:

List<String> message1 = Arrays.asList("this", "is", "a", "text");
List<String> message2 = Arrays.asList("this", "", "a", "");
List<String> message3 = Arrays.asList("", "is", "", "a", "text");
List<List<String>> allList = Arrays.asList(message1 , message2 , message3 );

在我的练习中,我必须在所有消息的帮助下恢复原始消息。如果缺少该单词,它将显示为“”。

如果所有消息中都漏掉了这个词,我想用“丢失的词”之类的东西来代替它。例如:

List<String> message1 = Arrays.asList("this", "is", "a", "");
List<String> message2 = Arrays.asList("this", "", "a", "");
List<String> message3 = Arrays.asList("", "is", "", "a", "");
List<List<String>> allList = Arrays.asList(message1 , message2 , message3 );

在该示例中,所有消息中都缺少单词 text。在那种情况下,我想在 allList 的那个位置用“lost-word”这个词替换。

我尝试做这样的事情:

for(int i = 0; i < message1.size(); i++){
    if(allList.stream().allMatch(m -> m.get(i).equals(""))) {
        allList.forEach(m -> m.set(i, "lost-word"));
    }
}

但我有以下错误:我在封闭范围内定义的局部变量必须是最终的或有效的最终。

看来我可以在 tha lambda 表达式中使用 i,我能做些什么来替换所有消息中丢失的单词?

在此先感谢,并为糟糕的英语感到抱歉。

标签: javajava-stream

解决方案


为避免获取有关捕获变量的错误,i您可以执行以下技巧:

for(int i = 0; i < message1.size(); i++){
    int cur = i;
    if(allList.stream().allMatch(m -> m.get(cur).equals(""))) {
        allList.forEach(m -> m.set(cur, "lost-word"));
    }
}

这里cur实际上是 final 的(意味着即使它没有声明它也不会改变final),我们可以在 lambda 中捕获它。


推荐阅读