java8 lambda使用方法

记录一下,利用java新特性 lambda表达式的使用方法,这里主要列举常用的3个(list转map,分组,过滤)

1. list转map

//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));

//list转map
Map<String, String> userMap = userList.stream().collect(
        Collectors.toMap(User::getId, User::getName)
);

//value是用户对象时
Map<String, String> userMap2 = userList.stream().collect(
        Collectors.toMap(User::getId, a -> a)
);

System.out.println("userMap === " + userMap);

运行结果

userMap === {111=张三, 222=李四}

特殊点:如果key存在相同时

/**
 * 注意:如果存在key值相同的,可以用 (k1,k2)->k1 来设置
 *      (k1,k2)->k1 如果有重复的key,则保留key1,舍弃key2  --- 保留前者
 *      (k1,k2)->k2 如果有重复的key,则保留key2,舍弃key1  --- 覆盖前者
 */
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));

userMap = userList.stream().collect(
        Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
);
System.out.println("userMap k1 === " + userMap);

userMap = userList.stream().collect(
        Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
);
System.out.println("userMap k2 === " + userMap);

运行结果

userMap k1 === {111=张三, 222=李四}
userMap k2 === {111=王五, 222=李四}

2. 分组

//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));

Map<String, List<User>> userGroupMap = userList.stream().collect(
        Collectors.groupingBy(User::getId)
);
System.out.println("userGroupMap === " + userGroupMap);

运行结果

userGroupMap === {111=[User(id=111, name=张三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}

3. 过滤

//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));

List<User> userFilterList = userList.stream()
        .filter(a -> a.getId().equals("111"))
        .collect(Collectors.toList());

System.out.println("userFilterList === " + userFilterList);

运行结果

userFilterList === [User(id=111, name=张三), User(id=111, name=王五)]

4. 完整示例代码

  • 用户对象
import lombok.Data;

/**
 * @author yanghao
 * @version User.java, v 0.1 2019-08-22 17:20
 */
@Data
public class User {

    /**
     * 用户编号
     */
    private String id;

    /**
     * 用户名称
     */
    private String name;

    /**
     * 构造器
     * @param id
     * @param name
     */
    public User(String id, String name){
        this.id = id;
        this.name = name;
    }
    
}
  • 测试类
import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author yanghao
 * @version LambdaTest.java, v 0.1 2019-08-22 17:19
 */
public class LambdaTest {

    @Test
    public void test(){
        //组装list集合
        List<User> userList = Lists.newArrayList();
        userList.add(new User("111", "张三"));
        userList.add(new User("222", "李四"));

        //1. list转map
        Map<String, String> userMap = userList.stream().collect(
                Collectors.toMap(User::getId, User::getName)
        );

		//value是用户对象时
		Map<String, String> userMap2 = userList.stream().collect(
		        Collectors.toMap(User::getId, a -> a)
		);

        System.out.println("userMap === " + userMap);
        //System.out.println("userMap2 === " + userMap2);

        /**
         * 注意:如果存在key值相同的,可以用 (k1,k2)->k1 来设置
         *      (k1,k2)->k1 如果有重复的key,则保留key1,舍弃key2  --- 保留前者
         *      (k1,k2)->k2 如果有重复的key,则保留key2,舍弃key1  --- 覆盖前者
         */
        userList.add(new User("111", "王五"));

        userMap = userList.stream().collect(
                Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
        );
        System.out.println("userMap k1 === " + userMap);

        userMap = userList.stream().collect(
                Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
        );
        System.out.println("userMap k2 === " + userMap);


        //2. 分组
        Map<String, List<User>> userGroupMap = userList.stream().collect(
                Collectors.groupingBy(User::getId)
        );
        System.out.println("userGroupMap === " + userGroupMap);


        //3.过滤
        List<User> userFilterList = userList.stream()
                .filter(a -> a.getId().equals("111"))
                .collect(Collectors.toList());

        System.out.println("userFilterList === " + userFilterList);
    }
}

运行结果

userMap === {111=张三, 222=李四}
userMap k1 === {111=张三, 222=李四}
userMap k2 === {111=王五, 222=李四}
userGroupMap === {111=[User(id=111, name=张三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}
userFilterList === [User(id=111, name=张三), User(id=111, name=王五)]
发布了39 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43968234/article/details/100020449