Java8 nouvelles fonctionnalités ------ API Stream et classe en option

API flux

1, la compréhension API Stream

①, le souci Stream est l'exploitation des données, traitant de la CPU. Collection souci est de stocker des données, le traitement de la mémoire

②, java8 fournit un api, api peut utiliser ce filtre, trier les données dans le mappage de la mémoire, et une autre opération de réduction. opérations connexes similaires aux tables de base de données sql.

2, notes

①, les éléments eux-mêmes flux ne sont pas stockés

②, Stream ne change pas l'objet source. Au lieu de cela, ils retourneront le résultat de la tenue d'un nouveau flux

③, opération de retard flux est effectuée. Cela signifie qu'ils devront attendre les résultats avant l'exécution

3, le flux d'exécution Torrent

①, instanciation flux

②, une série intermédiaire d'opérations (filtrage, cartographie, ...)

③, l'opération se terminant

4, Description:

Une chaîne intermédiaire des opérations, sur la source de données sont traitées

À la cessation d'opérations effectuées, l'opération est exécutée chaîne intermédiaire, et produire des résultats. Après cela, il ne sera pas utilisé

5, le fonctionnement du flot intermédiaire:

①, le dépistage de la tranche
Insérer ici l'image Description
code est le suivant:

@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);
}

②, le mappage
Insérer ici l'image Description
de code est ensuit que:

  @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();
    }

③, sorte
Insérer ici l'image Description
de code est suit comme:

@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, les opérations de terminaison de flux:

① et trouver correspondant
Insérer ici l'image DescriptionInsérer ici l'image Description
à code suit comme:

@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);
}

②, la réduction
Insérer ici l'image Description
de code est le suivant:

@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);
}

③, collection
Insérer ici l'image Description
code suit comme:

@Test
public void test7() {
    List<Employee> employees = Emp1oyeeData.getEmployees();
    List<Employee> employeelist = employees.stream().filter(e -> e.getSalary() > 8000).collect(Collectors.toList());
}

classe en option

1, classe introduction facultative

      classe optionnelle (java.util.Optional) est une classe de conteneur, il peut maintenir la valeur de type T, la valeur représentative est présent. Ou tout simplement ECONOMISEZ null, il indique que la valeur n'existe pas. A l'origine représenté par une valeur nulle n'existe pas, maintenant en option peut mieux exprimer ce concept. Et éviter une exception de pointeur NULL.

2, la méthode de l'objet de classe en option

  • Optional.of (T t): Création d'une instance en option, t doit être vide;
  • Optional.empty (): créer une instance vide en option
  • Optional.ofNullable (T t): t peut être nul

3, détermine si l'objet contenu dans le récipient facultatif:

  • boolean IsPresent (): déterminer si un objet comprenant
  • vide IfPresent (consommation <super T? consommateur>): S'il y a une valeur, exécute la consommation
    code qui implémente l'interface, et cette valeur est passée à elle comme argument.
  • Obtenez objet conteneur en option:
  • T get (): Si vous appelez l'objet contient la valeur, de retour cette valeur, sinon Lancers
  • T OrElse (T autre): Si la valeur sera retournée, sinon tout autre objet spécifié.
  • T orElseGet (autre fournisseur <T étend?>) :: En cas de valeur sera retourné, sinon la

4, l'objet d'interface de fournisseur fournit

  • T orElseThrow (Fournisseur exceptionSupplier <étend X ?>) :: S'il y a une valeur alors il est de retour à
    dos, ou jeté par l'interface fournisseur fournit.

5, Utilisation facultative de classe

@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());
Publié 67 articles originaux · a gagné les éloges 19 · vues 9867

Je suppose que tu aimes

Origine blog.csdn.net/qq_41530004/article/details/104423252
conseillé
Classement