java8 排序

新手上路,请多包涵

想实现如图的效果,因为这两个value是一样的,所以想重新排序一下,怎么实现呢?

用java8的stream,谢谢

clipboard.png

阅读 2.1k
2 个回答
✓ 已被采纳新手上路,请多包涵

fixed

ArrayList<LabelValue> collect = labelValues.stream().collect(ArrayList::new,
                    (result, map) -> {
                        Optional<LabelValue> exist = result.stream().filter(map1 -> map1.getLabel().equals(map.getLabel())).findFirst();
                        if (exist.isPresent()) {
                            LabelValue existMap = exist.get();
                            existMap.setValue(existMap.getValue() + "," + map.getValue());
                        } else {
                            result.add(map);
                        }
                    },
                    ArrayList::addAll
            );

题主你好,以下是我个人的看法,这个看起来是按照属性进行归类,然后归类后某些属性进行合并的需求,可以采用Collectors.groupingBy进行分类,这个方法,有多参的,我选择的是两个参数的

  • 第一个参数分类的属性
  • 第二个参数是分类后的对象如何拼装
        // 不考虑合并之后的数据顺序,可以选择这种
        // 1. 先用Collectors.groupingBy创建按照label分类的map
        // 2. 创建map的规则是,label作为key,value是先把LabelValue转换为value,然后value按照逗号拼接在一起
        // 3. 转换成map之后,按照entrySet的方式创建LabelValue
        List<LabelValue> labelValues2 = labelValues.stream()
                .collect(Collectors.groupingBy(LabelValue::getLabel, Collectors.mapping(LabelValue::getValue, Collectors.joining(","))))
                .entrySet()
                .stream()
                .map(LabelValue::new)
                .collect(Collectors.toList());

当然我给LabelValue也新增了一个构造方法

@Getter
@Setter
@AllArgsConstructor
public class LabelValue {

    private String label;
    private String value;

    public LabelValue(Map.Entry<String, String> mapEntry){
        this.label = mapEntry.getKey();
        this.value = mapEntry.getValue();
    }
}

仅供参考

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题