stream常用操作

本文展示了Java中对List的高效操作,包括使用流(Stream)获取ID,按字段分组,去重,以及计算两个List的交集和差集。此外,还演示了如何交换列表中指定元素的下标以及根据元素获取其在列表中的前一个、后一个、第一个和最后一个元素的ID。
摘要由CSDN通过智能技术生成

获取ID

List<String> idList = organs.stream().map(IBaseOrgan::getId).collect(Collectors.toList());

根据字段分组

Map<String, List<LptNavTree>> map =
                tree.stream().collect(Collectors.groupingBy(LptNavTree::getPlatformKey));
        List<LptNavTree> treeData = Lists.newArrayList();

        for (Map.Entry<String, List<LptNavTree>> entry : map.entrySet()) {
            LptNavTree data = new LptNavTree();
            data.setId(entry.getKey());
            data.setName(convertKey(entry.getKey()));
            data.setOpen(true);
            data.setChildren(entry.getValue());
            treeData.add(data);
        }

获取重复数据

        List<String> uniqueList = tree.stream().collect(Collectors.groupingBy(LptNavTree::getName, Collectors.counting()))
                .entrySet().stream().filter(e -> e.getValue() > 1)
                .map(Map.Entry::getKey).collect(Collectors.toList());

数据去重

List<LptNavTree> unique = tree.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(LptNavTree::getName))), ArrayList::new));
        
        

两个List,一个LIST根据另一个list取交集

        List<LptNavTree> intersectA = tree
                .stream() //获取第一个集合的Stream1
                .filter(  //取出Stream1中符合条件的元素组成新的Stream2,lambda表达式1返回值为true时为符合条件
                        a ->  //lambda表达式1,a为lambda表达式1的参数,是Stream1中的每个元素
                                repeatList.stream() //获取第二个集合的Stream3
                                        .map(LptNavTree::getName) //将第二个集合每个元素的id属性取出来,映射成新的一个Stream4
                                        .anyMatch( //返回值(boolean):Stream4中是否至少有一个元素使lambda表达式2返回值为true
                                                name -> //lambda表达式2,id为lambda表达式2的参数,是Stream4中的每个元素
                                                        Objects.equals(a.getName(), name) //判断name的值是否相等
                                        )
                )
                .collect(Collectors.toList()); //将Stream2转换为List

两个List,一个LIST根据另一个list取差集

        List<LptNavTree> differenceB = tree.stream().filter(b -> repeatList.stream().map(LptNavTree::getName).noneMatch(id -> Objects.equals(b.getId(), id))).collect(Collectors.toList());

下标交换

import java.util.*;
 
 
public class TestAa {
 
    private String name;
 
    private Integer id;
 
    public static void main(String[] args) {
        List<TestAa> list = new ArrayList<>();
        list.add(new TestAa("a", 1));
        list.add(new TestAa("b", 2));
        list.add(new TestAa("c", 3));
        list.add(new TestAa("d", 4));
 
        String name = "a";
        //找到name=德华的第一个对象的下标
        Optional<Integer> first = list.stream().
                filter(i -> Objects.equals(i.getName(), name)).
                map(list::indexOf).findFirst();
        if (first.isPresent()) {
            Integer index = first.get();
            System.out.println("true:" + index);
            //下标数据交换
            Collections.swap(list, 0, index);
        } else {
            System.out.println("false");
        }
        list.forEach(System.out::println);
    }
 
    public TestAa(String name, Integer id) {
        this.name = name;
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    @Override
    public String toString() {
        return "TestAa{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

list集合根据某一元素获取上一个、下一个、第一个、最后一个

说明:

1.NutMap = Map;

2.本文是用List<Map>来实现的,若使用List<T> 或者 List<String> 等原理是一样的;

3.大致思路就是先把所有的数据查询出来,根据某一个元素(或元素里某个唯一属性)来获取当前的下标,利用下标加减来实现。

4.本文仅适用部分场景,数据量太大的话自行处理.(建议使用rowid)

5.stream 好像有自带获取前一个、后一个、下标的方法,感兴趣的请自行查阅

6.数据库Mysql (其实哪种库都一样,反正用的是结果集合,纯属凑字数)
 

  public NutMap listOrder(List<NutMap> listMaps,String nowId){
        // 查询第一个,上一个,下一个,最后一个ID
        String firstId = "";
        String prevId = "";
        String nextId = "";
        String lastId = "";
 
        if(Lang.isEmpty(listMaps)){
            return NutMap.NEW();
        }
        // 当前记录的下标
        int index = 0;
        for (int i = 0; i < listMaps.size(); i++) {
            NutMap billMap = listMaps.get(i);
            if(billMap.getString("id").equals(nowId)){
                index = i;
                break;
            }
        }
 
        firstId = listMaps.get(0).getString("id");
        lastId = listMaps.get(listMaps.size() - 1).getString("id");
        if(index > 0){
            prevId = listMaps.get(index-1).getString("id");
        }
 
        if(index + 1 < listMaps.size()){
            nextId = listMaps.get(index+1).getString("id");
        }
 
        // 第一个值与当前值相同, 把第一个的值和上一个的值置空 (根据需求灵活变动)
        if(firstId.equals(nowId)){
            firstId = "";
            prevId = "";
        }
        // 最后一个值与当前值相同, 把最后一个的值和下一个的值置空 (根据需求灵活变动)
        if(lastId.equals(nowId)){
            nextId = "";
            lastId = "";
        }
        return NutMap.NEW().addv("firstId",firstId).addv("prevId",prevId)
                .addv("nextId",nextId).addv("lastId",lastId);

JS将某元素置顶

meKey.unshift(meKey.splice(meKey.findIndex((item) => item === 'wdgzpt') , 1)[0]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值