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=王五)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章