Java8の新機能ストリームの使い方
ストリーム フローの概念
ストリーム フローを使用する理由
#ストリーム フローの考え方は、生産工場の組み立てラインに似ています。複数の要素を操作する必要がある場合 (特にマルチステップ操作)、パフォーマンスと利便性を考慮して、まず「モデル」のステップ駆動計画を作成し、次にその計画に従って実行する必要があります。
Stream(Stream) は、データ ソースからの要素のキューです。
要素は キューを形成する特定のタイプのオブジェクト。 lava のストリームは要素を保存しませんが、オンデマンドで計算します。
データ ソース ストリームのソース。コレクション、配列などを指定できます。
ストリームの 2 つの基本特性:
·パイプライン:中間操作はストリーム オブジェクト自体を返します。この方法では、Fluent スタイルと同様に、複数の操作をパイプラインに接続できます。これにより、遅延やショートサーキットなどの操作を最適化できます。
内部反復: 以前は、コレクションの走査はイテレーターまたは拡張機能を使用してコレクションの外側で明示的に反復されていました。これは外部反復と呼ばれます。ストリームは内部反復メソッドを提供し、ストリームはトラバーサル メソッドを直接呼び出すことができます。
ストリームを使用する場合、通常は 3 つの基本的な手順が含まれます: データ ソース (ソース) の取得→データ変換: 目的の結果を得るために操作を実行します。元の Stream オブジェクトが変換されるたびに、元の Stream オブジェクトが変換され、新しい Stream オブジェクト (複数の変換が可能) が返されるため、そのオブジェクトに対する操作をチェーンのように配置してパイプラインにすることができます。
ストリームの取得 stream
#Collection コレクションを介して取得#すべての Collection コレクションは、ストリームのデフォルト メソッドを介してストリームを取得できますストリームを取得するには、一般的に次の 2 つの方法があります:
1. コレクション collection を通じて取得する
2.Stream get の静的メソッド
Stream インターフェースの static メソッドは配列に対応するストリームを取得できます。2 .Stream インターフェースの static メソッドは//把集合转换为stream流 //list集合 List<String>list=new ArrayList<>(); Stream<String>stream=list.stream(); //set集合 Set<String>set=new HashSet<>(); Stream<String>stream2=set.stream(); //map集合(map集合需要间接的转换) Map<String, String>map=new HashMap<>(); //方法一:获取键,存储到一个set集合中 Set<String>keySet=map.keySet(); Stream<String>stream3=keySet.stream(); //方法二:获取值,存储到一个collection集合中 Collection<String>values=map.values(); Stream<String>stream4=values.stream(); //方法三:获取键值对,,键与值的映射关系,entrySet() Set<Map.Entry<String, String>>entries=map.entrySet(); Stream<Map.Entry<String, String>>stream5=entries.stream();ログイン後にコピー
パラメータが可変パラメータである場合は、配列を渡すことができます
ストリーム stream の一般的なメソッド//把数组转换成Stream流 Stream<Integer>stream6=Stream.of(1,2,3,4,5); //可变参数可以传递数组 Integer[]arr={1,2,3,4,5}; Stream<Integer>stream7=Stream.of(arr); String[]arr2={"a","bb","ccc"}; Stream<String>stream8=Stream.of(arr2);ログイン後にコピー
stream の一般的なメソッドは 2 つのカテゴリに分類されます:
遅延メソッド:戻り値の型は引き続き Stream インターフェイス自体のメソッドであるため、連鎖呼び出しがサポートされます。 (最後のメソッドを除いて、他のすべてのメソッドは遅延メソッドです。)
ターミネーター メソッド:戻り値の型は、Stream インターフェイス独自の型のメソッドではなくなりました。 StringBuilder Chain 呼び出しなどのメソッドをサポートします。
上記はストリームの一般的なメソッドの一部です。これらのメソッドの使用方法を順番に学びましょう。
各トラバーサル メソッドの場合
このメソッドは Consumer インターフェイス関数を受け入れ、各ストリーム要素を処理のために関数に渡します。 Consumer インターフェイスは、ラムダ式を渡してデータを消費できるコンシューマ関数インターフェイスです。は、ストリーム内の数値をフィルタリングするために使用されます。 filter メソッドのパラメーター Predicate は関数型インターフェイスであるため、データをフィルターするためにラムダ式を渡すことができます。以下に示すように、filter メソッドを使用して変換を次のストリームにフィルタリングできます。foeeach メソッドは、ストリーム内のデータを走査するために使用されます。これは終了メソッドです。走査後は、ストリーム内の他のメソッドは使用できません。
基本的な使用法filter フィルタリング メソッド
public class Demo03Stream_forEach { public static void main(String[] args) { Stream<String>stream=Stream.of("张三","李四","王五","赵六","小明","小胖"); /*stream.forEach((String name)->{ System.out.println(name); });*/ stream.forEach(name->System.out.println(name)); } }ログイン後にコピー
必要に応じてストリーム内の要素を別のストリームに変換するには、map メソッドを使用できます。このインターフェイスには、以下に示すように、現在のストリームの T 型データ型を別の R 型データ ストリームに変換できる Function 関数インターフェイス パラメーターが必要です。さまざまな要素のデータを 1 つのタイプの要素に変換します。
上の図は、filter メソッドを使用していくつかの異なる要素をフィルタリングし、新しいストリームになります。 。
基本的には
マップ マッピング メソッド (変換) を使用します
public class Demo04Stream_filter { public static void main(String[] args) { //创建一个Stream流 Stream<String>stream=Stream .of("张三丰","赵敏","张无忌","周芷若","张三","狮王","张大牛"); //对Stream流中的元素进行过滤。只要张的人 Stream<String>stream2=stream.filter((String name)->{return name.startsWith("张");}); //遍历Stream流 stream2.forEach(name->System.out.println(name)); } }ログイン後にコピー
#基本的な使い方
public class Demo05Stream_map { public static void main(String[] args) { //获取一个String类型的Stream流 Stream<String>stream=Stream.of("1","2","3","4","5"); //使用map方法,把字符串类型的整数,转换(映射)为integer类型的整数 Stream<Integer>stream2=stream.map((String s)->{ return Integer.parseInt(s); }); //遍历Stream流 stream2.forEach(i->System.out.println(i)); } }ログイン後にコピーcount 要素数を数える方法
ストリーム内の要素の数をカウントするために使用されます。count メソッドは最終メソッドであり、戻り値は Long 型の整数です。そのため、Stream ストリームで他のメソッドを呼び出すことはできなくなりました。
基本的な使用方法
public class Demo06Stream_count {
public static void main(String[] args) {
//获取一个Stream流
ArrayList<Integer>list=new ArrayList<Integer>();
//添加元素
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
Stream<Integer>stream=list.stream();
//统计stream流中的元素个数
long count=stream.count();
//打印输出
System.out.println(count);//7
}
}
ログイン後にコピーlimit截取流元素方法
Limit方法可以对流进行截取,只取用前n个。参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作。limit方法是一个延迟方法,只是对流中的元素进行截取,返回一个新的流,使用可以继续调用stream流中的其他方法。

基本使用
public class Demo07Stream_limit {
public static void main(String[] args) {
show02();
}
private static void show02() {
//创建一个String类型的数组
String[]arr={"喜羊羊","美羊羊","沸羊羊","懒羊羊","灰太狼","红太狼"};
//集合获取一个Stream流
Stream<String>stream=Stream.of(arr);
//用limit方法截取前6个元素
Stream<String>stream2=stream.limit(3);
//遍历Stream2流
stream2.forEach(i->System.out.println(i));
}
}
ログイン後にコピー
skip跳过元素方法
如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流,如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的流。

基本使用
public class Demo08Stream_skip {
public static void main(String[] args) {
//创建一个String类型的数组
String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"};
//获取Stream流
Stream<String>stream=Stream.of(arr);
//使用skip方法截取后面的元素
Stream<String>stream2=stream.skip(5);
//遍历stream2流
stream2.forEach(i->System.out.println(i));
}
}
ログイン後にコピー
concat:合并方法
用于把流组合到一块。如果有两个流,希望合并成为一个流,就可以使用concat方法

基本使用
public class Demo09Stream_concat {
public static void main(String[] args) {
//创建一个Stream流
Stream<String>stream=Stream.of("张三丰","张翠山","赵敏","周芷若","张无忌");
//创建一个String类型的数组
String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"};
//获取Stream流
Stream<String>stream2=Stream.of(arr);
//使用常用方法concat方法合并流
Stream<String>stream3=Stream.concat(stream, stream2);
//遍历Stream3流
stream3.forEach(i->System.out.println(i));
}
}
ログイン後にコピー
Stream流的练习
最后,我们通过下面的练习来巩固一下上面所学的内容。
现在有两个ArrayList集合存储队伍当中的多个成员姓名,
要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:
1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。
2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。
3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。
4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。
5.将两个队伍合并为一个队伍;存储到一个新集台中。
6.根据姓名创建Person对象:存储到一个新集合中,
7.打印整个队伍的Person对象信息。
示例:
第一支队伍:迪丽热巴、宋远桥、苏星河、石破天、石中玉、老子、庄子、洪七公
第二支队伍:古娜力扎、张无忌、赵丽颖、张三丰、尼古拉斯赵四、张天爱、张二狗
public class Demo06Stream_count { public static void main(String[] args) { //获取一个Stream流 ArrayList<Integer>list=new ArrayList<Integer>(); //添加元素 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); Stream<Integer>stream=list.stream(); //统计stream流中的元素个数 long count=stream.count(); //打印输出 System.out.println(count);//7 } }
Limit方法可以对流进行截取,只取用前n个。参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作。limit方法是一个延迟方法,只是对流中的元素进行截取,返回一个新的流,使用可以继续调用stream流中的其他方法。
基本使用
public class Demo07Stream_limit { public static void main(String[] args) { show02(); } private static void show02() { //创建一个String类型的数组 String[]arr={"喜羊羊","美羊羊","沸羊羊","懒羊羊","灰太狼","红太狼"}; //集合获取一个Stream流 Stream<String>stream=Stream.of(arr); //用limit方法截取前6个元素 Stream<String>stream2=stream.limit(3); //遍历Stream2流 stream2.forEach(i->System.out.println(i)); } }
如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流,如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的流。
基本使用
public class Demo08Stream_skip { public static void main(String[] args) { //创建一个String类型的数组 String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"}; //获取Stream流 Stream<String>stream=Stream.of(arr); //使用skip方法截取后面的元素 Stream<String>stream2=stream.skip(5); //遍历stream2流 stream2.forEach(i->System.out.println(i)); } }
用于把流组合到一块。如果有两个流,希望合并成为一个流,就可以使用concat方法
基本使用
public class Demo09Stream_concat { public static void main(String[] args) { //创建一个Stream流 Stream<String>stream=Stream.of("张三丰","张翠山","赵敏","周芷若","张无忌"); //创建一个String类型的数组 String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"}; //获取Stream流 Stream<String>stream2=Stream.of(arr); //使用常用方法concat方法合并流 Stream<String>stream3=Stream.concat(stream, stream2); //遍历Stream3流 stream3.forEach(i->System.out.println(i)); } }
最后,我们通过下面的练习来巩固一下上面所学的内容。
现在有两个ArrayList集合存储队伍当中的多个成员姓名,
要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:
1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。
2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。
3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。
4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。
5.将两个队伍合并为一个队伍;存储到一个新集台中。
6.根据姓名创建Person对象:存储到一个新集合中,
7.打印整个队伍的Person对象信息。
示例:
第一支队伍:迪丽热巴、宋远桥、苏星河、石破天、石中玉、老子、庄子、洪七公
第二支队伍:古娜力扎、张无忌、赵丽颖、张三丰、尼古拉斯赵四、张天爱、张二狗
首先创建Person对象类
public class Person { private String name; public Person() { super(); } public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [name=" + name + "]"; } }
然后再根据习题要求用Stream流进行过滤
1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。
2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。
// 第一支队伍 // 创建集合 ArrayList<String> one = new ArrayList<>(); // 添加元素 one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河"); one.add("石破天"); one.add("石中玉"); one.add("老子"); one.add("庄子"); one.add("洪七公"); //1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。 //2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。 Stream<String>oneStream=one.stream().filter(name->name.length()==3).limit(3);
3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。
4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。
// 第二支队伍 // 创建集合 ArrayList<String> tow = new ArrayList<>(); // 添加元素 tow.add("古娜力扎"); tow.add("张无忌"); tow.add("赵丽颖"); tow.add("张三丰"); tow.add("尼古拉斯赵四"); tow.add("张天爱"); tow.add("张二狗"); //3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。 //4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。 Stream<String>towStream=tow.stream().filter(name->name.startsWith("张")).skip(2);
5.将两个队伍合并为一个队伍;存储到一个新集台中。
6.根据姓名创建Person对象:存储到一个新集合中,
7.打印整个队伍的Person对象信息。
//5.将两个队伍合并为一个队伍;存储到一个新集台中。 //6.根据姓名创建Person对象:存储到一个新集合中, //7.打印整个队伍的Person对象信息。 Stream.concat(oneStream,towStream).map(name->new Person(name)).forEach(p->System.out.println(p));
以上がJava8の新機能ストリームの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
