繁体   English   中英

Java 8将Lambda Map >精简到具有映射键要求的字符串

Java 8 Refining Lambda Map> to String With Map Key Requirement

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

地图的键可以是值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 个回复

处理映射中缺失值的正确方法是computeIfAbsent() ,这是自Java 8以来可用于Map的新方法。

这给你下面的代码:

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

s现在保存该值(如果与您的示例映射一起使用):

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

请注意,没有尾随" - " Collectors.joining()确保不在元素之前或之后附加分隔符。

我正在使用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,  [] - ,  [] - ,  [] - ,  [] - ]

更简单的方法:

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

在这里,我们遍历列表中的每个元素,以查看它是否作为地图中的键存在。 根据值,我们附加相应的字符串

注意:

假设您的地图定义为Map<Integer, String>则已完成解析

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

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(" [] - ");
    }
});
1 用于映射>的Java 8 Lambda列表

我有一个带有以下元素的dto列表。 userSeqId具有重复值, 我正在尝试使用Java 8 Lambda将'userSeqId'分组到Map。 我想要Map&lt;Integer, List&lt;String&gt;&gt; ,其中Key应为userSeqId ,Value ...

8 转换列表到地图在 Java 中

我想将列表转换为地图,其中键只是一个计数器,它需要遵守列表的顺序。 我目前有这个代码: 我有两个问题: 在我桌面上的一个简单的控制台应用程序测试中,计数器保留了列表的顺序。 我们可以确定订单在其他任何地方执行时都会保留吗? 有没有更好的方法来编码? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM