Java 8では、Streamデータストリーム操作によりコレクション操作が大幅に簡素化されます。Streamを学習した後、forループなしでコレクションに対して多くの操作を実行できます。
記事のディレクトリ
ストリームの初期化
JavaでのすべてのStream操作はストリームオブジェクト用であるため、StreamタイプオブジェクトがStreamを使用できるように初期化する必要があります。
-
ストリームの初期化:
Stream stream = Stream.of("a","b","c");
-
配列をストリームに変換します。
String [] strArray = new String[]{ "a","b","c"}; Stream stream = Stream.of(strArray); //或者 Stream stream = Arrays.stream(strArray);
-
コレクションオブジェクトはストリームに変換されます。
List<String> list = Arrays.asList(strArray); stream = list.stream();
ストリーム操作
1.トラバース操作(マップ)
マップ操作を使用して、コレクション内の各オブジェクトをトラバースし、それを操作します。
マップ操作.collect(Collectors.toList())
後、それを使用して操作後のセットを取得できます。
例えば:
//1.1 遍历并转换为大写
List<String> output = wordList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
//1.2 对每个元素进行平方计算
List<Integer> nums = Arrays.asList(1,2,3,4);
List<Integer> squareNums = nums.stream()
.map(n->n*n)
.collect(Collectors.toList());
2.フィルタリング操作(フィルター)
フィルタを使用してストリーム内のデータ要素をフィルタリングできます。フィルタリングされた要素は保持され、新しいストリームが生成されます。
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
.filter(s->!s.isEmpty())
.collect(Collectors.toList());
3.ループ操作(forEach)
ストリーム内の各オブジェクトに対するカスタム操作には、forEachを使用できます。
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s->System.out.println(s));
4.特定の結果セットを返します(制限/スキップ)
- limitは、ストリームの最初のn個の要素を返します
- スキップは最初のn個の要素をスキップすることです
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream()
.skip(2)
.limit(3)
.collect(Collectors.toList());
//先跳过前2个元素
//再取Stream剩余元素的前3,生成新的Stream并返回
5.並べ替え(並べ替え/最小/最大/個別)
- sortは、コレクション内のすべての要素をソートできます。
- max、minは、ストリーム内の最大/最小の要素を見つけることができます。
- Distinctはユニークな要素を見つけることができます。
//1.对集合排序
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream()
.sorted((In1,In2)->In1-In2)
.collect(Collectors.toList());
//2.获取最大长度的元素
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream() //获取列表中最长元素的长度
.mapToInt(s->s.length())
.max().getAsInt();
//3.对集合进行查重
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream()
.distinct()//去重
.collect(Collectors.toList())
6.マッチング(マッチ関連)
セット内のすべての条件が条件を満たしているかどうか、またはセット内の条件を満たしている要素があるかどうかを判断する必要がある場合は、matchメソッドを使用できます。
- allMatch:ストリーム内のすべての要素が渡された述語に追加され、trueを返します。
- anyMatch:ストリーム内の任意の要素が着信述語と一致し、trueを返します。
- noneMatch:渡された述語に一致する要素がストリームにない場合、trueを返します。
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
//1.判断集合中是否存在“c”的字符串元素
Boolean isExits = matchList.stream()
.anyMatch(s->s.equals("c"));
//2.判断集合中是否全不为空
Boolean isAllNull = matchList.stream()
.allMatch(s->s.isNotEmpty());
Boolean isAllNull2 = matchList.stream()
.noneMatch(s->s.isEmpty());