Javaの基本スキル:リストからマップリストへのいくつかの姿勢

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して4日目です。クリックしてイベントの詳細をご覧ください。

今日は、実用的な知識のポイント、リストをに変換する方法を紹介しますMap<Object, List<Object>>

1.基本的な書き方

最初の紹介はもちろん最も一般的で直感的な書き方であり、もちろん制限された書き方でもあります

// 比如将下面的列表,按照字符串长度进行分组
List<String> list = new ArrayList<>();
list.add("hello");
list.add("word");
list.add("come");
list.add("on");
Map<Integer, List<String>> ans = new HashMap<>();

for(String str: list) {
    List<String> sub = ans.get(str.length());
    if(sub == null) {
        sub = new ArrayList<>();
        ans.put(str.length(), sub);
    }
    sub.add(str);
}
System.out.println(ans);
复制代码

jdk8 +の場合、上記のforループの内容はMap.computeIfAbsent次のように置き換えることができます。

for (String str : list) {
    ans.computeIfAbsent(str.length(), k -> new ArrayList<>()).add(str);
}
复制代码

もちろん、それはすでにjdk1.8であるため、Streamのストリーム処理の助けを借りて、上記の手順を次のように簡略化できます。

Map<Integer, List<String>> ans = list.stream().collect(Collectors.groupingBy(String::length));
复制代码

2.一般的なアプローチ

上記は特定のリスト、ビジネス開発と変革のためのものであり、次に一般的なツールクラスを構築しようとします

ここで主に使用する知識ポイントはジェネリックであり、重要なポイントはマップでキーを取得する方法です

jdk <1.8の書き込み方法の場合、キーの取得姿勢はインターフェースを介して定義されます。

public static <K, V> Map<K, List<V>> toMapList(List<V> list, KeyFunc<V, K> keyFunc) {
    Map<K, List<V>> result = new HashMap<>();
    for (V item: list) {
        K key = keyFunc.getKey(item);
        if (!result.containsKey(key)) {
            result.put(key, new ArrayList<>());
        }
        result.get(key).add(item);
    }
    return result;
}

public static interface KeyFunc<T, K> {
    K getKey(T t);
}
复制代码

次のようにデモを使用します

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("hello");
    list.add("word");
    list.add("come");
    list.add("on");
    Map<Integer, List<String>> res = toMapList(list, new KeyFunc<String, Integer>() {
        @Override
        public Integer getKey(String s) {
            return s.length();
        }
    });
    System.out.println(res);
}
复制代码

次に、jdk1.8以降の書き込みメソッドとストリーム+関数メソッドを組み合わせて実現する方法を見てみましょう。

public static <K, V> Map<K, List<V>> toMapList(List<V> list, Function<V, K> func) {
    return list.stream().collect(Collectors.groupingBy(func));
}
复制代码

対応する使用法は次のとおりです

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("hello");
    list.add("word");
    list.add("come");
    list.add("on");
    Map<Integer, List<String>> res = toMapList(list, (Function<String, Integer>) String::length);
    System.out.println(res);
}
复制代码

3.ツール

前のセクションでは、ジェネリック+ jdk8ストリーム+関数メソッドに基づくジェネリック変換ツールクラスの実装を紹介しました。次に、1.8以降に適したツールクラスを要約して出力します。

/**
 * List<V>转换为Map<K, List<V>> 特点在于Map中的value,是个列表,且列表中的元素就是从原列表中的元素
 *
 * @param list
 * @param func 基于list#item生成Map.key的函数方法
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<K, List<V>> toMapList(List<V> list, Function<V, K> func) {
    return list.stream().collect(Collectors.groupingBy(func));
}

/**
 * List<I>转换为Map<K, List<V>> 特点在于Map中的value是个列表,且列表中的元素是由list.item转换而来
 *
 * @param list
 * @param keyFunc 基于list#item生成的Map.key的函数方法
 * @param valFunc 基于list#item转换Map.value列表中元素的函数方法
 * @param <K>
 * @param <I>
 * @param <V>
 * @return
 */
public static <K, I, V> Map<K, List<V>> toMapList(List<I> list, Function<I, K> keyFunc, Function<I, V> valFunc) {
    return list.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valFunc, Collectors.toList())));
}
复制代码

4.GuavaHashMultimap拡張ナレッジポイント

最後に、拡張ナレッジポイントが導入されます。GauvaツールキットはHashMultimapツールクラスを提供します。その使用姿勢は通常のマップと同じですが、その値はコレクションであることに注意してください。

List<String> list = new ArrayList<>();
list.add("hello");
list.add("word");
list.add("come");
list.add("on");
list.add("on");
HashMultimap<Integer, String> map = HashMultimap.create();
for (String item: strList) {
    map.put(item.length(), item);
}
System.out.println(map);
复制代码

実際の出力は次のとおりです。これにより、値が実際にセットであることが確認されます(1つしかない場合、上記のツールクラスの場合は、2つ出力されます)。

{2=[on], 4=[word, come], 5=[hello]}
复制代码

灰色の連絡先

本がないよりも本がない方が良いです。上記の内容は純粋に1つの家族からのものです。個人的な能力が限られているため、必然的に脱落や間違いがあります。バグを見つけたり、より良い提案がある場合は、批判して修正してください。 。 ありがとうございました

  • 個人サイト:blog.hhui.top
  • Weiboアドレス:Xiaohuihuiブログ
  • QQ:グレーグレー/ 3302797840
  • WeChatパブリックアカウント:灰色のブログ

おすすめ

転載: juejin.im/post/7104267494537297933