フィルタに値をマッピングするためのJavaストリーム(ストリーム)を使用して、ソート操作

序文

Java8ストリーム(ストリーム)のためにエレガントな、便利、高速で効率的な操作がXinshouがバーに固執すでにあるが、唯一のリスト、セット。私は顔ではない地図まあなければならないのですか?職場でのマップリストからのデータ転送を動作させるために必要なので、このエッセイがあるでしょう。

新しい作成しUser、次の使用にクラス、有料の注意をlombok、あなたがしている場合idea、プラグインダウンロードし、頼りにしてください、ここで私が使用してmavenここに引用少し詳細を。

/**
 * @program: strategy-demo
 * @description: stream操作
 * @author: YuAoTian
 * @create: 2020-01-06 23:23
 **/
@Data
@AllArgsConstructor
class User{
    private Integer id;
    private String name;
    private String city;
    private Integer age;
}

コードを見て継続して見Mainている方法

 public static void main(String[] args) {
        List<User> userList = Arrays.asList(
                new User((int) (Math.random()*10),"小明","北京",18),
                new User((int) (Math.random()*10),"小红", "南京", 17),
                new User((int) (Math.random()*10),"小丫", "湖北", 14),
                new User((int) (Math.random()*10),"小黑", "深圳", 22),
                new User((int) (Math.random()*10),"小玉", "广州", 19),
                new User((int) (Math.random()*10),"小小", "江西", 21)
                );
      Map<Integer, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getId));//已ID作为Key
    }

地図ソート

正の変位

Map<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> o.getValue().get(0).getAge())).map(entry -> {
            Map<Integer, List<User>> result = new LinkedHashMap<>();
            result.put(entry.getKey(), entry.getValue());
            return result;
        }).reduce((map1, map2) -> {
            map2.forEach(map1::put);
            return map1;
        }).get();
     System.out.print(map);

輸出

{5=[User(id=5, name=小丫, city=湖北, age=14), User(id=5, name=小玉, city=广州, age=19), User(id=5, name=小小, city=江西, age=21)], 0=[User(id=0, name=小红, city=南京, age=17)], 8=[User(id=8, name=小明, city=北京, age=18)], 9=[User(id=9, name=小黑, city=深圳, age=22)]}

反転

 Map<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {
            //倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。
            Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;
            return temp.getValue().get(0).getAge();
        }).reversed()).map(entry -> {
            Map<Integer, List<User>> result = new LinkedHashMap<>();
            result.put(entry.getKey(), entry.getValue());
            return result;
        }).reduce((map1, map2) -> {
            map2.forEach(map1::put);
            return map1;
        }).get();
    System.out.print(map);

輸出

{3=[User(id=3, name=小黑, city=深圳, age=22)], 5=[User(id=5, name=小玉, city=广州, age=19)], 0=[User(id=0, name=小明, city=北京, age=18), User(id=0, name=小丫, city=湖北, age=14)], 2=[User(id=2, name=小红, city=南京, age=17), User(id=2, name=小小, city=江西, age=21)]}

これらは、小型からソートの多額の年齢のためのもの、そして最後のリターンがあるOptionalいくつかの例では、缶を理解していない場合は、次の表情。

Optional<Map<Integer, List<User>>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {
            //倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。
            Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;
            return temp.getValue().get(0).getAge();
        }).reversed()).map(entry -> {
            Map<Integer, List<User>> result = new LinkedHashMap<>();
            result.put(entry.getKey(), entry.getValue());
            return result;
        }).reduce((map1, map2) -> {
            map2.forEach(map1::put);
            return map1;
        });
        //为null返回false,否则true,即可调用get()返回~
        if(map.isPresent()){
            Map<Integer, List<User>> listMap = map.get();//调用get()返回一个Map
        }
        System.out.print(map);

最適化

Map<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {
            //倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。
            Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;
            return temp.getValue().get(0).getAge();
        }).reversed()).collect(LinkedHashMap::new,(m,e) -> m.put(e.getKey(),e.getValue()),LinkedHashMap::putAll);

世界が平和で静かなの多くを感じる瞬間ではありません - あなたはインデントのいくつかは、彼が1行に減らすことができるものに対処することができます!


地図フィルター

map.entrySet().stream().filter(entry -> entry.getValue().get(0).getAge() > 16).collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), LinkedHashMap::putAll);
 System.out.println(map);

輸出

{1=[User(id=1, name=小丫, city=湖北, age=14)]}

歳のうちフィルタ<16、フィルタは、私は他の例を提供していない非常に単純で、ライン上で直接収集、フィルタと〜


希望を伝えるためのより良い方法がある場合は、この論文では、それは〜、終わりました

おすすめ

転載: www.cnblogs.com/yuaotian/p/StreamMapValuesFilter.html