【问题标题】:Populate a list of object from a map using stream使用流从地图中填充对象列表
【发布时间】:2020-03-21 23:36:04
【问题描述】:

我有下面的地图和一个字符串

/**
4->"welcome"
3->"to"
2->"my"
1->"blog"
*/

Map<Integer, String> myMap = ImmutableMap.of(4, "welcome", 3, "to", 2, "my",1,"blog");
String s= "welcome to my blog everyone"

现在我需要根据降序从字符串中删除单词来填充下面的对象列表(地图已经降序排序)

{
   "level": 1,
   "delete":["welcome"],
   "modString":"to my blog everyone" 
}
{
   "level": 2,
   "delete":["welcome","to"],
   "modString":"my blog everyone" 
}
{
   "level": 3,
   "delete":["welcome","to","my"],
   "modString":"blog everyone" 
}
{
   "level": 4,
   "delete":["welcome","to","my","blog"],
   "modString":"everyone" 
}

列表的类型为 Delete

public class Delete {
    private Integer level;
    private String modString;
    private List<String> delete;

    public Delete(
            Integer level,
            String modString,
            List<String> delete) {
        this.level = level;
        this.modString = modString;
        this.delete = delete;
    }

 //getters and setters

    }

}

我可以通过迭代地图来做到这一点,但我在想是否可以使用 Streams 来做到这一点。

【问题讨论】:

标签: java java-stream


【解决方案1】:

我不太明白地图键的用途及其与关卡的关系。但我假设您想要解决 lambda 中的 java 变量必须是final。为此,您可以使用java.util.concurrent.atomic.AtomicReference 或同一包中的其他类。

final AtomicReference<String> modString = new AtomicReference<>(s);
final Comparator<Map.Entry<Integer, String>> comparing = Comparator.comparing(Map.Entry::getKey);
final List<String> deletedOnes = new ArrayList<>(myMap.size());
final List<Delete> result = myMap.entrySet().stream().sorted(comparing.reversed()).map(entry -> {
    deletedOnes.add(entry.getValue());
    modString.set(modString.get().replaceFirst(entry.getValue(), "").trim());
    return new Delete(myMap.size() - entry.getKey() + 1, modString.get(), new ArrayList<>(deletedOnes));
}).collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 2011-05-28
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多