jdk8新特性之stream流

本文详细介绍Java Stream API的应用,包括基本运算、集合操作如求交集、差集,以及集合到Map的转换。通过实例演示如何利用Stream API进行数据处理,提高代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类型转换

List、Map之间转换,常见的用法有:

1、toMap将List转成Map

注意使用toMap最好加mergeFunction重复处理方法, 否则对于重复的key会抛异常。即使用

Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction)

demo:

List<User> users;
Map<String, String> idMap = users.stream().collect(Collectors.toMap(User::getParentUserId, User::getId, (o, n) -> n));
Map<String, Asset> assetMap = assetList.stream().collect(Collectors.toMap(Asset::getId, Asset -> Asset, (v1, v2) -> v2));
2、 List<?>转成Map<Key,List<?>>
Map<String, List<UserFile>>  userFilesMap = userFileList.stream().collect(Collectors.groupingBy(UserFile::getUserId));
3、从对象集合中获取字段集合
List<Account> accounts;
        List<String> accountIds =
                accounts.stream().map(Account::getId).collect(Collectors.toList());

一、集合的基本运算: 

import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
public class StreamDemo {
 
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        User user = new User();
        user.setId("1");
        user.setName("张一");
        userList.add(user);
        user = new User();
        user.setId("4");
        user.setName("张四");
        userList.add(user);
        user = new User();
        user.setId("2");
        user.setName("张二");
        userList.add(user);
        user = new User();
        user.setId("3");
        user.setName("张三");
        userList.add(user);
        user = new User();
        user.setId("5");
        user.setName("张二");
        userList.add(user);
 
        // 获取名称的集合 (stream 串行流)
//        List<String> collect = userList.stream().map(User::getName).collect(Collectors.toList());
//        System.out.println("获取名称的集合:" + collect);
//        //parallelStream() − 为集合创建并行流    并行流是多线程的结果,速度比stream快很多,可能会和stream结果不一致,但是效率很高
//        collect = userList.parallelStream().map(User::getName).collect(Collectors.toList());
//        System.out.println("获取名称的集合:" + collect);
 
        // 限制输出
//        List<String> collect = userList.stream().map(User::getName).limit(3).collect(Collectors.toList());
//        System.out.println("限制输出三个:" + collect);
 
        // 获取排序的集合
//        List<String> collect = userList.stream().map(User::getId).sorted().collect(Collectors.toList());
//        System.out.println("获取排序的集合:"+collect);
 
        // 获取去除重复的集合
//        List<String> collect = userList.stream().map(User::getName).distinct().collect(Collectors.toList());
//        System.out.println("获取去除重复的集合:"+collect);
 
        // 过滤
//        List<String> collect = userList.stream().map(User::getName).filter(str -> !str.isEmpty()).collect(Collectors.toList());
//        System.out.println("过滤:"+collect);
 
        // 获取集合装字符串
//        String mergedString = userList.stream().map(User::getName).filter(str -> !str.isEmpty()).collect(Collectors.joining(", "));
//        System.out.println("直接获取字符串:"+mergedString);
 
        // 获取空字符串的数量
//        List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//        long count = strings.stream().filter(string -> string.isEmpty()).count();
//        System.out.println("获取空字符串的数量:"+count);
 
        // 统计 (总数量,总和,最小值,最大值,平均值)
//        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//        IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
//        System.out.println("统计:"+stats);
 
        // 获取对应的平方数
//        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//        List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
//        System.out.println("去重获取平方:"+ JSON.toJSONString(squaresList));


      //字符串转整形
  //public static Consumer> lambdaConversion() {
     //   return list -> Lists.newArrayList(list.stream()
     //           .mapToInt(Integer::valueOf)
     //           .iterator());
   // }
 
    }
}

还可以做条件合并查询,如:

 List<SchoolProject> schoolTemProjects = temporarySchoolProjects.stream().filter(
                        r -> currSchoolId == r.getSchoolId() &&
                                currProjectCode() == r.getProjectCode()).collect(Collectors.toList());

二、集成求交集、差集:info  : ['A'  ,'B'  ,'C'  ,'D' , 'E',  'F']   ;     list :  ['A'  ,'B'  ,'C'  ,'D' , 'G',  'H'] 

List<TbBaseinfo> differenceSet1 = info.stream().filter(item -> !list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//已有数据和提交数据的差集,得到差集['E',  'F']
List<TbBaseinfo> differenceSet2 = list.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//提交数据和已有数据的差集,得到差集['G',  'H']
List<TbBaseinfo> differenceSet = new ArrayList<TbBaseinfo>(differenceSet1);
differenceSet.addAll(differenceSet2);//两个差集合并在一起
differenceSet = differenceSet.stream().distinct().collect(Collectors.toList());//合并后的差集去重  [ 'E',  'F'  ,'G',  'H' ]

//2.已经存在的集合,和本次提交的集合,求交集
List<TbBaseinfo> intersection = info.stream().filter(item -> list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList()); //得到交集:['A'  ,'B'  ,'C'  ,'D']

//3.本次保存的集合,和交集,的差集
List<TbBaseinfo> allDifferenceSet1 = info.stream().filter(item -> !intersection.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());

//['A'  ,'B'  ,'C'  ,'D' , 'G',  'H']和 ['A'  ,'B'  ,'C'  ,'D']的差集,得到差集:['G',  'H']
List<TbBaseinfo> allDifferenceSet2 = intersection.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());

//['A'  ,'B'  ,'C'  ,'D']和 ['A'  ,'B'  ,'C'  ,'D' , 'G',  'H']的差集,得到差集:[]
List<TbBaseinfo> allDifferenceSet = new ArrayList<EcBaseinfo>(allDifferenceSet1);
allDifferenceSet.addAll(allDifferenceSet2);   //合并差集为:['G',  'H']
allDifferenceSet = allDifferenceSet.stream().distinct().collect(Collectors.toList());   //去重还是['G',  'H']

List<TbBaseinfo> allDifference = allDifferenceSet;

//4.最终的差集,和第一次的差集,的交集,即是要添加的,差集即是要删除的
List<TbBaseinfo> addList = differenceSet.stream().filter(item -> !allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());

//['G',  'H']和[ 'E',  'F'  ,'G',  'H' ]的交集:['G',  'H'],即是要添加的,插入
List<TbBaseinfo> delList = differenceSet.stream().filter(item -> allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());

//['G',  'H']和[ 'E',  'F'  ,'G',  'H' ]的差集:['E',  'F'],即是要删除的

三、集合转化为Map:

List转换为Map,使用Collectors.toMap方法进行转换:User类,分别有id,name,age三个属性。List集合,userList,存储User对象

1、指定key-value,value是对象中的某个属性值

 Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));

2、指定key-value,value是对象本身,User->User 是一个返回本身的lambda表达式

Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));

3、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身

 Map<Integer,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

4、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身,key 冲突的解决办法,这里选择第二个key覆盖第一个key

 Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));

5、Map<String, List<User>> userMap = sList.stream().collect(Collectors.groupingBy(User::getSchoolId));
User::getSchoolId可以用user->user.getSchoolId()来代替

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值