Java 8将具有映射键要求的Lambda Map <string,list <string =“” >>细化为字符串

时间:2018-11-14 17:27:02

标签: java java-8

地图的键可能是值1-5,其中不需要每个键,但是如果不存在,则必须连接类似于“-[]”的内容。

我之前已经使用过Java 8,我觉得可以使用stream()和collect()来更高效地完成此工作,但是我觉得外部列表的要求让我失望了。下面的代码有效,但感觉不正确。

List<String> ids = Arrays.asList("1", "2", "3", "4", "5");

StringBuilder location = new StringBuilder();

ids.forEach(id -> {
    List<String> addresses = map.get(id);
    if (addresses != null) {
        addresses.forEach(addr -> location.append(addr + " - "));
    } else {
        location.append(" [] - ");
    }
});

为科罗拉多州的位置生成如下所示的内容:

US - CO - [] - CENTENNIAL -

在回答尼古拉斯K时,地图的一个例子是

{1=[US], 2=[CO], 5=[METROPOLITAN FOOTBALL STADIUM DISTRICT, REGIONAL TRANSPORTATION DISTRICT]}

并有望收到输出

US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT

4 个答案:

答案 0 :(得分:3)

处理映射中缺失值的正确方法是computeIfAbsent(),这是自Java 8起在var headerFooterHeight = 200; window.setInterval( function(){ document.getElementById("words").style.height = (window.innerHeight - headerFooterHeight)+"px"; console.log(document.getElementById("words").style.height); }, 100); 上推出的新方法。

这将为您提供以下代码:

Map
  • 首先,让我们遍历存储在String s = ids.stream() .map(id -> map.computeIfAbsent(id, absentKey -> singletonList("[]"))) .flatMap(Collection::stream) .collect(Collectors.joining(" - ")); 列表变量中的地图中的键。
  • 然后,如果该值为null,则映射到默认值(ids),否则"[]"返回实际值。
  • 由于您要打印用computeIfAbsent()分隔的所有值,因此我们只需对列表流进行平面映射,并通过" - "将它们加入。

" - "现在保存值(如果与示例地图一起使用):

s

请注意,没有结尾的"US - CO - [] - [] - METROPOLITAN FOOTBALL STADIUM DISTRICT - REGIONAL TRANSPORTATION DISTRICT" " - "确保不要在元素之前或之后附加定界符。

答案 1 :(得分:1)

我正在使用StreamOptional处理null引用:

List<String> result = ids.stream()
  .map(index -> format(map.get(index)))
  .collect(Collectors.toList());
System.out.println(result);

方法format

  private static String format(List<String> address) {
    return Optional.ofNullable(address)
      .map(a -> a.stream().map(part -> Optional.ofNullable(part).orElse("[]")).collect(Collectors.joining(" - ")))
      .orElse(" [] - ");
  }

应用于示例:

  public static void main(String[] args) {
    Map<String, List<String>> map = Map.of("1", Arrays.asList("US", "CO", null, "CENTENNIAL"));

    List<String> ids = Arrays.asList("1", "2", "3", "4", "5");

    List<String> result = ids.stream()
      .map(index -> format(map.get(index)))
      .collect(Collectors.toList());
    System.out.println(result);
  }

打印:

[US - CO - [] - CENTENNIAL,  [] - ,  [] - ,  [] - ,  [] - ]

答案 2 :(得分:1)

更简单的方法:

    ids.stream().map(l -> map.get(Integer.parseInt(l))).forEach(i -> {
        if (i != null) {
            location.append(i + " - ");
        } else {
            location.append("[] - ");
        }
    });

在这里,我们遍历列表中的每个元素以查看其是否在地图中作为键出现。根据值,我们附加适当的 strings

注意:

假设您的地图定义为Map<Integer, String>

,分析已经完成

答案 3 :(得分:1)

也许不是很干净,但是您可以尝试:

Map<String, List<String>> inputMap = Map.of("1", List.of(), "2", List.of("l1", "l2"));
List<String> ids = List.of("1", "2", "3", "4", "5");
StringBuilder location = new StringBuilder();
ids.forEach(id -> {
    if (inputMap.get(id) != null) {
        location.append(inputMap.get(id).stream().map(addr -> addr + " - ").collect(Collectors.joining()));
    } else {
        location.append(" [] - ");
    }
});