当前位置: 首页 > 知识库问答 >
问题:

Java地图过滤列表8

宇文和昶
2023-03-14

我有一个地图数据结构列表。我需要通过在每个映射中搜索一个值来过滤列表(结果总是只有一个映射)。下面的代码显示了我的两种实现方法。虽然我的Lambda方法很管用,但在我看来似乎有些臃肿。我觉得这里缺少了一些简单的东西,有一个更简洁的Lambda可以代替这个。我很感激任何能让Lambda变得更好的建议。多谢了。


package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Temp {

  public static void main(String[] args) {

    Map<String, String> map1 = new HashMap<>();
    map1.put("map1-key1", "map1-value-1");
    map1.put("map1-key2", "map1-value-2");
    map1.put("map1-key3", "map1-value-3");
    
    Map<String, String> map2 = new HashMap<>();
    map2.put("map2-key1", "map2-value-1");
    map2.put("map2-key2", "some_wanted_value");
    map2.put("map2-key3", "map2-value-3");

    Map<String, String> map3 = new HashMap<>();
    map3.put("map3-key1", "map3-value-1");
    map3.put("map3-key2", "map3-value-2");
    map3.put("map3-key3", "map3-value-3");

    List<Map<String, String>> LOMs = new ArrayList<>();
    
    LOMs.add(map1);
    LOMs.add(map2);
    LOMs.add(map3);

    String column = "some_wanted_value";
      
    // Imperative method.  
    Map<String, String> x = new HashMap<>();
    for(Map<String, String> lom : LOMs) {
      if(lom.containsValue(column)) {
        x = lom;
        break;
      }
    }
    x.forEach((k,v) -> System.out.println(k + "->" + v));
    /*
    map2-key1->map2-value-1
    map2-key3->map2-value-3
    map2-key2->some_wanted_value
     */

    // Lambda method.
    Map<String, String> y = LOMs
      .stream()
      .filter(s -> s.containsValue(column))
      .flatMap(s -> s.entrySet().stream())
      .map(s -> s.toString().split("="))
      .collect(Collectors.toMap(s -> s[0], s -> s[1], (o, n) -> o));
    y.forEach((k,v) -> System.out.println(k + "->" + v));
    /*
    map2-key1->map2-value-1
    map2-key3->map2-value-3
    map2-key2->some_wanted_value
     */

  }
}

共有1个答案

贺景山
2023-03-14

您只需要将sprint的结果限制为一个单一的结果,以匹配您的命令解决方案,而不需要再次收集它来使其过于复杂

java prettyprint-override">LOMs.stream()
        .filter(s -> s.containsValue(column))
        .findFirst()
        .orElseGet(Collections::emptyMap)
        .forEach((k, v) -> System.out.println(k + "->" + v));

另一种方法是使用ifpresent而不是orelseget来确保您不会不必要地实例化映射,这当然取决于您需要什么

LOMs.stream()
        .filter(s -> s.containsValue(column))
        .findFirst()
        .ifPresent(map -> map.forEach((k, v) -> System.out.println(k + "->" + v)));

这将打印与命令式解决方案和另一个涉及流的解决方案相同的结果

map2-key1->map2-value-1
map2-key3->map2-value-3
map2-key2->some_wanted_value
 类似资料:
  • 问题内容: 我有两个列表,我要过滤两个列表都包含的thoose元素。我想用lambda表达式做到这一点。 用户getName和客户端getUserName都返回String。 这是我的示例代码: 问题答案: 但这效率很低,因为它是O(m * n)。您最好创建一组可接受的名称: 还要注意,它并不严格等同于您拥有的代码(如果已编译),如果有多个用户具有与该客户端相同的名称,则该客户端会将同一客户端两次

  • 我有一个物体,如下所示 给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型? 目前为止我有 但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。 例如 我会传入匹配类型B和子类型Z,所以我希望得到一个结果- 以下当前返回列表中的2个项目。 但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

  • 我有下面的地图地图,并想过滤它的基础上的一个值。结果应分配回同一地图。请告诉我什么是最好的方法。 我尝试了如下操作,但无法访问employee对象

  • 我正在寻找在Java-8中过滤列表的最干净的方法,用一个简单的lambda ,而不用创建一个新的列表。 特别是,这种解决方案不合适,因为返回一个新的: 注意,下面的解决方案也不起作用,因为列表应该< code>clear()其原始值(但是很明显,如果您在过滤之前清除它,就没有什么可过滤的了...): (此外,我更喜欢不使用第三方库或框架的解决方案)

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。