レビューと説明
私たちは、ラムダ式、および参照メソッドとコンストラクタへのラムダ式から機能のインタフェース参照のラムダ式の原則との関係を使用する理由以前の3つの章java8ブログのリリース後は、あなたが理解するだろう。
ストリームは、あなたが、私たちは、ストリームのストリームAPIを学習の先進的なラムダ式の話をしている今日、以前の知識や理解に精通していることを学びたい流れ込みます。
二つの流れストリームは何ですか
流れアセンブリパッケージと、...、複数のこのような食品包装工程として、我々はすべて知っている、より、あなたは食べ物を提供するために、食品のスタッフを持っている必要がありますように、加工食品加工、スパイスを追加します。簡単に言えば、工場のような一般的な流れは、アセンブリと同じに並びます。
ストリームの流れが宣言(SQLデータベースを操作することを想像することができる)動作を設定するために使用することができることができ、それは高レベルのイテレータのデータセットを見ることができます。操作が流れたとき、私たちは、工場の組立ラインに例えることができます。
3つの利点の流れ
それの利点流れは何ですか?流れは、我々はそれに反復フローを使用しない理由違いの収集のためのことを繰り返し、サイクルであることが判明しましたか?
- データ収集が計算格納され、我々はトラバーサルのセットを使用し、もちろん滞在しなければならない、我々は中断することはできません。我々は最初の部分をロードすることができるようにストリームのようなストリームの流れ、一部が遮断途中休暇を一時停止することができ参照または設定をより柔軟に比べ流れ
- 流れを反復することは、あなただけの繰り返し流れた後、この流れの完全な反復が消費されたことを意味しており、使い捨てです。
- 内部ループ反復のためのストリームと比較すると、限り、我々は特定に動作フローを与えるようOK機能が、外部ループ反復のためになります。
操作4ストリームのストリーム中に
操作の供給源とフローベースの式ストリームフローラインは、プロセスは、三の終了
:共通の中間動作フロー
共通エンドフロー:
5つの共通StreamAPI
初期の車両情報
public List<Car> InitCar(){
ArrayList<Car> carList = new ArrayList<>();
Car car1 = new Car("100", "black", "中国", 20);
Car car2 = new Car("101", "gray", "中国", 30);
Car car3 = new Car("102", "yello", "中国", 50);
Car car4 = new Car("103", "silvery", "英国", 20);
Car car5 = new Car("104", "red", "英国", 30);
carList.add(car1);
carList.add(car2);
carList.add(car3);
carList.add(car4);
carList.add(car5);
return carList;
}
フィルタ
フィルタ機能は、エレメンタリストリームをフィルタリングすることで、我々が必要 - 中間操作
@Test
public void filterTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 筛选车辆时黑色的车
List<Car> result = cars.stream()
.filter(car -> car.getColor().equals("black"))
.collect(Collectors.toList());
//[Car(code=100, color=black, factory=中国, price=20.0)]
System.out.println(result);
}
ソート2
中間を操作する - の機能をデフォルトとなるための要素を昇順にソート
@Test
public void sortTest(){
int[] ints = {0, 5, 7, 6, 15, 13, 27};
Arrays.stream(ints).sorted().forEach(System.out::println);
}
3重複排除
重複の別個の要素を取り除く - 中間操作
@Test
public void distinctTest(){
int[] ints = {5,6,5,6,27};
// 5 6 27
Arrays.stream(ints).distinct().forEach(System.out::println);
}
4カット
中間操作 - 制限機能は、フロー要素を制限します
@Test
public void limitTest(){
int[] ints = {5,6,5,6,27};
// 5 6
Arrays.stream(ints).limit(2).forEach(System.out::println);
}
5ジャンプ
スキップ機能n個の要素をスキップ - 中間作動
@Test
public void skipTest(){
int[] ints = {5,6,5,6,27};
// 27
Arrays.stream(ints).skip(4).forEach(System.out::println);
}
6マッピング
マップ変換関数であり、関数は、各要素上にマッピングされたパラメータ、新しい要素への遷移として受け付けます。 - 中間操作
@Test
public void mapTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 只获得车的价格
cars.stream().limit(1)
.map(Car::getPrice)
.forEach(System.out::println);//20.0
}
7平坦化ストリーム
概要は、複合ストリームの複数のストリームとして中間缶機能をflatMap。 - 中間操作
@Test
public void flatMapTest(){
String[] array = {"youku1327"};
// 存放的是一个个数组 [Ljava.lang.String;@61f3fbb8
Arrays.stream(array).map(s -> s.split(""))
.forEach(System.out::print);
// 将一个个数组流合并为一个流输出:youku1327
Arrays.stream(array).map(s -> s.split(""))
.flatMap(Arrays::stream)
.forEach(System.out::print);
}
8任意の一致
任意の流れの要素にマッチしたanyMatch関数はtrueを返します。---操作が終了されます
@Test
public void anyMatchTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 任意匹配黄色的车
boolean yello = cars.stream()
.anyMatch(car -> car.getColor().equals("yello"));
System.out.println(yello);//true
}
9完全一致
allMatch完全一致要素の流れ関数はtrueを返します。 - 操作の終了
@Test
public void allMatchTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 完全匹配黄色的车
boolean yello = cars.stream()
.allMatch(car -> car.getColor().equals("yello"));
System.out.println(yello);//false
}
10非マッチング
noneMatch機能は、真のリターンを流すための要素のいずれかと一致していません。------操作を終了
@Test
public void noneMatchTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 不是youku1327这个颜色的车
boolean yello = cars.stream()
.noneMatch(car -> car.getColor().equals("youku1327"));
System.out.println(yello);//true
}
任意の要素ストリームを求めて11
返されたストリームのいずれかの要素の機能を見つけるfindAny。---操作が終了されます
@Test
public void findAnyTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 不是youku1327这个颜色的车
Optional<Car> anyCar = cars.stream().findAny();
Car car = anyCar.orElse(new Car("141", 50));
// Car(code=100, color=black, factory=中国, price=20.0)
System.out.println(car);
}
12ストリームの最初の要素を探して
この関数は、FindFirst関数は、最初のエレメンタリーストリームを検索します。--------操作を終了
@Test
public void findFirstTest(){
// 初始化车辆
List<Car> cars = carFunFactory.InitCar();
// 不是youku1327这个颜色的车
Optional<Car> anyCar = cars.stream().findFirst();
// Car(code=100, color=black, factory=中国, price=20.0)
System.out.println(anyCar.get());
}
13削減
後のように前面と次の第1の動作前の基準として動作後の基準値に関数のパラメータを減少させ、。 - 操作の終了
@Test
public void reduceTest(){
int[] ints = {3,4,5,};
int reduce = Arrays.stream(ints)
.reduce(0, (left, right) -> left + right);
// 求和 12
System.out.println(reduce);
OptionalInt max = Arrays.stream(ints).reduce(Integer::max);
// 求最大值 5
System.out.println(max.getAsInt());
OptionalInt min = Arrays.stream(ints).reduce(Integer::min);
// 求最小值 3
System.out.println(min.getAsInt());
}
14数値
IntStream、DoubleStreamとLongStreamは、それぞれ自動包装を避け、longとdouble、要素特int型に流れ込みます
。-----中間操作
@Test
public void numTest(){
int[] ints = {5,6,5,6};
// int流
IntStream intStream = Arrays.stream(ints);
// 6767爱看youku1327
intStream.mapToObj(value -> value+1).forEach(System.out::print);
System.out.println("爱看youku1327");
double[] doubles = {5,6,5,6};
// double流
DoubleStream doubleStream = Arrays.stream(doubles);
//5.06.05.06.0关注youku1327
doubleStream.forEach(System.out::print);
System.out.println("关注youku1327");
// long流
Long[] longs = {5L,6L,5L,6L};
Stream<Long> longStream = Arrays.stream(longs);
long count = longStream.count();
// 4
System.out.println(count);
}
15ストリーム変換
元のストリームとして伝達関数値を箱入り。-----中間操作
@Test
public void streamSwapTest(){
int[] ints = {5,6,7};
// 将int流转为原始流
Optional<Integer> first = Arrays.stream(ints).boxed().findFirst();
System.out.println(first.get());//5
// 2.23606797749979 2.449489742783178 2.6457513110645907
Arrays.stream(ints).boxed()
.mapToDouble(s ->Math.sqrt(s))
.forEach(System.out::println);
}
シックス・ストリームの構築
流量値を生成します
@Test
public void buildStreamByValue(){
Stream<String> stream = Stream.of("关", "注", "微", "信", "公", "众", "号", ":", "youku1327", "谢谢");
//关注微信公众号:youku1327谢谢
stream.map(StringUtils::join).forEach(System.out::print);
}
2ストリームのアレイによって作成
@Test
public void skipTest(){
int[] ints = {5,6,5,6,27};
// 27
Arrays.stream(ints).skip(4).forEach(System.out::println);
}
3ファイルストリームを作成します。
@Test
public void buildStreamByFile(){
try {
Stream<String> lines = Files.lines(Paths.get("C:\\mydata\\youku1327.txt"), Charset.defaultCharset());
lines.map(s -> s.split(""))
.flatMap(Arrays::stream)
.forEach(System.out::print);//youku1327
} catch (IOException e) {
e.printStackTrace();
}
}
4無限のストリームを作成します。
無線ストリームは、要素を作成されているので、我々は、制約を見ている、生成し、反復が無制限の流れを作成することです。
@Test
public void buildStreamByIterate(){
long count = Stream.iterate(1, integer -> integer + 1)
.limit(100)
.count();
System.out.println(count);//100
}
七つの謝辞
あなたは、多くの普通のシーンの作業を行うことができます基本的にこの1つのストリームのストリーミングAPI操作を見た後、先輩の操作はの逆流更新していきます
公共のマイクロチャネル番号の最後の一押し波を、それへの注意に学ぶことに興味を持っています。