[javasterdi]13Javaベース(10)


2021-Java Studio第10週課題


Javaベース


集合フレームワーク(JCF)


Javaコレクションフレームワークとは、Javaに格納されているデータの基本データ構造を1つの場所に集中して管理し、使いやすいものを指す.

インタフェース実装クラスの特徴:ListLinkedListStackVectorArrayListシーケンスを有するデータセット、重複許容されたSetHashSetTreesSetシーケンスを保持しないデータセット、重複許容されたxMapHashMapTreeHashTable KeyValueペアの値が重複可能なx

Listインタフェース


LinkedList:双方向ポインタ構造;頻繁なデータ挿入/削除は非常に有用であり、ArrayListに比べて検索効率が低下する
Stack:一端から挿入および削除できるデータ構造.
Vector:ダイナミックサイズ配列と配列と同様に、配列はインデックスによってアクセスおよび同期でき、一度に1つのスレッドしか呼び出せないベクトルメソッドです.マルチスレッド環境でない場合は、ArrayListを使用することを推奨します.
ArrayList:一方向ポインタ構造、データインデックス、クエリー性能に優れ、頻繁にデータを挿入/削除する効率が低い

Setインタフェース


HashSet:予測不可能な順序;Hashアルゴリズムを使用したランダムアクセス速度が最も速い
TreeSet:データをバイナリ検索ツリーとして格納し、格納順序xを保持する

Mapインタフェース


HashMap:繰り返しと順序xを許可し、ValueにNull値を入れることができる
TreeMap:キー値が自然な順序で昇順され、キー値ペアとして格納されます.ソートとクイック検索
HashTable:HashMapより遅いが同期し、Valueは空の値Xを許可する

Streamのフィーチャークリーンアップ(map、filter、sorded、distive、limit、foreach)

ArrayList<string> list = new ArrayList<>(Arrays.asList("Apple","Banana","Apple",Melon","Grape","Strawberry"));

map


要素を特定の条件の値に変換
大文字と小文字の変換などの処理に使用
list.stream().map(s->s.toUpperCase());
list.stream().map(String::toUpperCase);
その後collectで結果を返すことができます.foreachで直接出力することもできます.
System.out.println(list.stream().map(s->s.toUpperCase()).collect(Collectors.toList())); //[APPLE, BANANA, APPLE, MELON, GRAPE, STRAWBERRY]

filter


要素を条件でフィルタ
特定の文字を含む長さ制限の使用
list.stream().filter(t->t.length()>5)
エレメントサイズが5より大きいもののみがフィルタされます.
System.out.println(list.stream().filter(t->t.length()>5).collect(Collectors.toList())); //[Banana, Strawberry]

sorted


要素のソート操作
list.stream().sorted()
リスト内の要素をソートします.
System.out.println(list.stream().sorted().collect(Collectors.toList())); //[Apple, Apple, Banana, Grape, Melon, Strawberry] 

discinct


要素の重複除外
list.stream().distinct()
リスト内の重複を削除します.
list.stream().distinct().forEach(System.out.println);
// Apple
// Banana
// Melon
// Grape
// Strawberry

limit


ストリームから一定数のデータを取得して、新しいストリームを返します.
list.stream.limit(3).forEach(System.out.println);
// Apple
// Banana
// Apple

foreach


個々の出力要素
list.stream.forEach(System.out.println);
// Apple
// Banana
// Apple
// Melon
// Grape
// Strawberry

Collection.foreachとStream。foreach差異


Streamオブジェクトを使用するかどうか


Collection.forEachはオブジェクトを作成せずにメソッドを呼び出します.
反対ストリームメソッドを呼び出すにはstream()を使用してStreamオブジェクトを作成する必要があります.
list.forEach(System.out::println);
list.stream().forEach(Systmem.out::println);

Parallel Stream

public void print() { List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
    System.out.println("Collection.forEach 출력 시작");
    nums.forEach(System.out::println);
    System.out.println("Stream.forEach 출력 시작");
    nums.parallelStream().forEach(System.out::println); }
//Collection.forEach 출력 시작
//1
//2
//3
//4
//5
//Stream.forEach 출력 시작
//3
//4
//1
//5
//2

출처: https://dundung.tistory.com/247 [DunDung]
ParallelStreamによって作成されたストリームオブジェクトは、複数のスレッド上でストリームを実行するため、実行順序は予知できませんが、Collection.foreachは一定の順序を保証します.

for文をストリームに変換する方法

List<String> list1= Arrays.asList("a", "b", "c", "d", "e");
List<String> list2 = Arrays.asList("a", "b", "d");

//for문 사용해 같은 것만 List에 담으려면

List<String> result1 = new ArrayList<>();
    for(String str1 : list1){
        for(String str2 : list2){
            if(str1.equals(str2)){
                result1.add(str1);
            }
        }
    }
    for(String str : result1){
        System.out.print(str);
    }

// stream 이용해 같은 것만 List에 담으려면
 List<String> result2 =
    list1.stream()
        .filter(str -> list2.stream().anyMatch(Predicate.isEqual(str)))
        .collect(Collectors.toList());

    result2.stream().forEach(System.out::print);