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

Java流-收集、转换和收集

南宫阳焱
2023-03-14

我想获取地图的值,找到min值,并为地图的每个条目构造一个新的CodesWitMinValue实例。我希望使用Java11个流,我可以在多行中使用多个流(一个用于min值,一个用于转换)来实现这一点。是否可以使用java 11流和收集器在单行中实现?谢谢。

public static void main(String[] args) {
        Map<String, Integer> codesMap = getMockedCodesFromUpstream();
        var minValue = Collections.min(codesMap.values());
        var resultList = codesMap.entrySet().stream()
                .map(e -> new CodesWithMinValue(e.getKey(), e.getValue(), minValue))
                .collect(Collectors.toUnmodifiableList());

        //is it possible to combine above three lines using stream and collectors API, 
       //and also can't call getMockedCodesFromUpstream() more than once. getMockedCodesFromUpstream() is a mocked implementation for testing.
        //TODO: combine above three lines into a single line if possible
        System.out.println(resultList);
    }
    
    private static Map<String, Integer> getMockedCodesFromUpstream(){
        Map<String, Integer> codesMap = new HashMap<>();
        codesMap.put("CDXKF", 44);
        codesMap.put("GFDFS", 13);
        codesMap.put("KUSSS", 10);
        codesMap.put("EWSNK", 52);
        codesMap.put("IOLHF", 21);
        return codesMap;
    }

    private static class CodesWithMinValue{
        public final String code;
        public final int value;
        public final int minValue;

        public CodesWithMinValue(String code, int value, int minValue) {
            this.code = code;
            this.value = value;
            this.minValue = minValue;
        }

        @Override
        public String toString() {
            return "CodesWithMinValue{" +
                    "code='" + code + '\'' +
                    ", value=" + value +
                    ", minValue=" + minValue +
                    '}';
        }
    }

共有1个答案

戚默
2023-03-14

我觉得这可以通过重构和隐藏数据片段来简化,而不是过度使用收集器。

  private static BiFunction<Map<String, Integer>, Integer, List<MyNode>> getListOfMyNodeWithMinValue =
      (map, minValue) ->
          map.entrySet().stream()
              .map(entry -> new MyNode(entry.getKey(), entry.getValue(), minValue))
              .collect(Collectors.toList());

  public static Function<Map<String, Integer>, List<MyNode>> getMyNodes =
      map -> getListOfMyNodeWithMinValue.apply(map, Collections.min(map.values()));

之后可以将其用作MyNode。getMyNodes。应用(inputMap)。

忽略我的命名约定。只要输入我的感觉。希望你有这个想法。

 类似资料:
  • 为了更好地理解新的流API,我试图转换一些旧代码,但我被困在这一个。 我似乎无法为它创建有效的收集器:

  • 我使用的是java 11,我有一个名为MyObject的对象列表,看起来像这样 我想使用流将这些对象收集到地图中 我试着用收集器来做。toMap(),但似乎不可能做到这一点 我的问题是可以制作一张地图吗

  • 我有一个列表的地图,并希望收集所有的值,然后流在收集的列表上,所以给出:- 下面的工作/显示了我想用迭代做什么,但我想在流中做这些,而不是使用迭代创建一个中间列表:- 因此,我希望将列表的映射流化到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中完成上述操作(即通过迭代构建列表,然后进行流化以筛选/排序和收集)。 到目前为止,我还没有做到这一点,当我尝试流式/收集地图时,我会遇到编译

  • 我有一个列表,我想用流过滤,抓取前10个,并显示给用户。按下按钮后..我想从那个位置继续流。 但问题是,这里我不得不在第一个10+多个不匹配的过滤器上运行过滤器(再次)。

  • 请考虑以下类: 如何才能编写一个java流“管道”,其工作方式与第一个方法(getRemainingCompanyBalance)相同。此代码将导致错误。 该清单包含每个部门的单独清单。子列表中的每个条目都是类的一个实例。名称/费用:

  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的