#ストリーム フローの考え方は、生産工場の組み立てラインに似ています。複数の要素を操作する必要がある場合 (特にマルチステップ操作)、パフォーマンスと利便性を考慮して、まず「モデル」のステップ駆動計画を作成し、次にその計画に従って実行する必要があります。
Stream(Stream) は、データ ソースからの要素のキューです。
要素は キューを形成する特定のタイプのオブジェクト。 lava のストリームは要素を保存しませんが、オンデマンドで計算します。
データ ソース ストリームのソース。コレクション、配列などを指定できます。
·パイプライン:中間操作はストリーム オブジェクト自体を返します。この方法では、Fluent スタイルと同様に、複数の操作をパイプラインに接続できます。これにより、遅延やショートサーキットなどの操作を最適化できます。
内部反復: 以前は、コレクションの走査はイテレーターまたは拡張機能を使用してコレクションの外側で明示的に反復されていました。これは外部反復と呼ばれます。ストリームは内部反復メソッドを提供し、ストリームはトラバーサル メソッドを直接呼び出すことができます。
ストリームを使用する場合、通常は 3 つの基本的な手順が含まれます: データ ソース (ソース) の取得→データ変換: 目的の結果を得るために操作を実行します。元の Stream オブジェクトが変換されるたびに、元の Stream オブジェクトが変換され、新しい Stream オブジェクト (複数の変換が可能) が返されるため、そのオブジェクトに対する操作をチェーンのように配置してパイプラインにすることができます。
#Collection コレクションを介して取得#すべての Collection コレクションは、ストリームのデフォルト メソッドを介してストリームを取得できますストリームを取得するには、一般的に次の 2 つの方法があります:
1. コレクション collection を通じて取得する
2.Stream get の静的メソッド
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();2 .Stream インターフェースの static メソッドは
パラメータが可変パラメータである場合は、配列を渡すことができます
//把数组转换成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 の一般的なメソッド
遅延メソッド:戻り値の型は引き続き 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方法可以对流进行截取,只取用前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 サイトの他の関連記事を参照してください。