ストリームAPI
1、ストリームAPIの理解:
①、ストリームの懸念は、CPUを扱う、データの操作です。コレクションの懸念は、メモリを扱う、データの格納にあります
②、java8は、APIは、このフィルタ、ソートメモリマッピングのデータ、及び他のリダクション演算を使用することができ、APIを提供します。で、SQLデータベーステーブルに似た関連事業。
2,注意点
①、ストリーム要素自体は保存されません
②、ストリームは、ソースオブジェクトを変更しません。代わりに、彼らは新しいストリームを保持した結果を返します。
③、ストリーム遅延動作が行われます。これは、彼らが実行前に結果まで待機する必要があることを意味します
3、ストリーム実行の流れ
①、ストリームインスタンス化
②、動作の中間シリーズ(フィルタリング、マッピング、...)
③、動作を終了
4、概要:
データソースの操作の中間体鎖は、処理され
動作の終了時に、動作は、中間鎖、および農産物の結果を実行します。その後、それは使用されません
図5に示すように、中間ストリームの操作:
①、スライススクリーニング
次のようにコードすることです。
@Test
public void test4(){
List<Employee> list = EmployeeData.getEmployees();
Stream<Employee> stream = list.stream();
//filter
stream.filter(e ->e.getSalary() > 7000).forEach(System.out::println);
//limit
list.stream.limit(3).forEach(System.out::println);
//limit
list.stream.skip(3).forEach(System.out::println);
//distinct
list.stream.distinct().forEach(System.out::println);
}
②、マッピング・
コードは以下の通りであります:
@Test
public void test4(){
List<String> list = Arrays.asList("AA","BB","cc","dd");
list.stream().map(str -> str.toLowerCase()).forEach(System.out::println);
//获取员工姓名长度大于3的员工姓名
List<Employee> employees = EmployeeData.getEmployees();
//map和filter
Stream<String> namesStream = employees.stream().map(Employee::getName);
namesStream.filter(name -> name.length() > 3).forEach(System.out::println);
//map
Stream<Stream<Character>> streamStream = list.stream().map(ProxyTest::fromStringToStream);
streamStream.forEach(s -> s.forEach(System.out::println));
//flatMap
Stream<Character> characterStream = list.stream().flatMap(ProxyTest::fromStringToStream);
characterStream.forEach(System.out::println);
}
public static Stream<Character> fromStringToStream(String str){
ArrayList<Character> list = new ArrayList<>();
for (Character character : str.toCharArray()){
list.add(character);
}
return list.stream();
}
③、ソート
コードは以下の通りであります:
@Test
public void test7() {
//sorted()-自然排序
List<Integer> list = Arrays.asList(12, 43, 34, 87, -98, 7);
list.stream().sorted().forEach(System.out::println);
//sorted(Comployee com)-定制排序
List<Employee> employees = EmployeeData.getEmployees();
employees.stream().sorted((e1, e2) -> {
int ageValue = Integer.compare(e1.getAge(), e2.getAge());
if (ageValue != 0) {
return ageValue;
} else {
return -Double.compare(e1.getSalary(), e2.getSalary());
}
}).forEach(System.out::println);
}
6、ストリームの終了操作:
①、及びマッチング検索
コードは以下の通りであります:
@Test
public void test7() {
List<Employee> employees = EmployeeData.getEmployees();
//allMatch(predicate p)-检查是否匹配所有元素
boolean allMatch = employees.stream().allMatch(e -> e.getAge() >18);
//anyMatch(Predicate P)-检查是否至少匹配一个元素。
boolean anyMatch = employees.stream().anyMatch(e ->e.getSalary() > 10000);
//noneMatch(Predicate p)一 检查是否没有匹配的元素。
boolean noneMatch = employees.stream().noneMatch(e -> e.getName().tartsWith("周"));
///findFirst- 返回第一 个元囊
Optional<Employee> employee = employees.stream().findFirst();
//findAny- -返回当前流中的任意元素
optiona1<Employee> employee1 = employees.paralle1Stream().findAny();
// count- 返回流 中元素的总个数
long count = employees. stream().filter(e -> e.getSalary() > 5000).count();
//max(Comparator c)一返回流中最大值
Stream<Double> salaryStream = employees.stream().map(e -> e.getSalary());
Optional<Double> maxsalary = salaryStream.max(Double :: compare);
//min(Comparator c)-返回流 中最小值
Optional<Employee> minsalary = employees.stream().min((e1,e2) -> Double.compare(e1.getSalary(), e2.getsalary()));
//forEach(Consumer c)一内部迭代
employees.stream().forEach(System.out :: print1n);
}
②、削減の
コードは以下の通りであります:
@Test
public void test7() {
//reduce(T identity, BinaryOperator)- 可以将流中元素反复结合起来,得到一个值。返回T
//计算1-10的自然数的和
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Integer sum = list. stream().reduce( 0, Integer :: sum);//sun-->55
//reduce(BinaryOperator)一可以将流中元素反复结合起来,得到一个值。返回optional<T>
//计算公司所有员工工资的总和
List<Employee> employees = EmployeeData.getEmployees();
Stream<Double> salaryStream = emp1oyees.stream().map(Emp1oyee :: getSalary);
Optional <Double> sumMoney = salaryStream. reduce(Double::sum);
}
③、コレクション・
コードは以下の通りであります:
@Test
public void test7() {
List<Employee> employees = Emp1oyeeData.getEmployees();
List<Employee> employeelist = employees.stream().filter(e -> e.getSalary() > 8000).collect(Collectors.toList());
}
オプションのクラス
1、はじめにオプションのクラス
任意のクラス(java.util.Optional)はコンテナクラスであり、それは代表値が存在し、型Tの値を保持することができます。それとも、nullを保存、それは値が存在しないことを示しています。もともと今のオプションは、より良い、このコンセプトを表現することができ、存在しない場合はnull値によって表されます。そして、ヌル・ポインター例外を避けます。
2、オプションのクラスオブジェクトのメソッド
- Optional.of(T T):インスタンスオプションを作成し、Tが空でなければなりません。
- Optional.empty():空のインスタンスを作成するオプション
- Optional.ofNullable(T T):tがあってもよいヌル
図3は、オブジェクトがコンテナオプションに含まれているか否かを判断します。
- ブールisPresent():オブジェクトを含むかどうかを決定します
- 空ifPresent(消費者<スーパーT?消費者>): 値がある場合は、消費者が実行
実装インタフェースというコードを、この値が引数として渡されます。 - オブジェクトオプションのコンテナを取得します。
- T GET():あなたがオブジェクトに値が含まれて呼び出した場合、その値を返し、そうでない場合は例外
- T orElse(T他の):返される値が存在する場合、そうでなければ他のオブジェクトが指定されました。
- (他のサプライヤー<拡張T?>)T orElseGet ::、値が返されますがある場合は、そうでありません
4、サプライヤインタフェースオブジェクトが提供します
- T orElseThrow(サプライヤーexceptionSupplier <Xを拡張する ?>):: 値がある場合、それがバックにある
バック、またはインタフェースが提供するサプライヤーによってスロー。
5、クラスのオプションの使用
@Test
public void test7() {
Girl girl = new Gir1();
girl = nu11;
//of(T t):保证t是非空的
optional<Girl> optiona1Girl = Optional.of(gir1);
//ofNullable(T t): t可以为null
optional<Girl> optiona1Girl1 = Optional.ofNullable(gir1);
}
@Test
public void test2() {
Boy b = new Boy("张三");
Optional<Girl> opt = Optional.ofNullable(b.getGrilFriend());
// 如果有女朋友就返回他的女朋友,否则只能欣赏“嫦娥”了
Girl girl = opt.orElse(new Girl("嫦娥"));
System.out.println("他的女朋友是:" + girl.getName());