Быстрый запуск потока java8

Java

Стрим поток

Введение

В Java 8, благодаряlambdaприносит функциональное программирование, представляя совершенно новыйStream流Концепция для решения существующих недостатков коллекций.


выгода

Сначала рассмотрим пример:

Отфильтруйте строки, начинающиеся с «zhang» в именах, чтобы получить подмножество 1, затем отфильтруйте строки длины 3 в подмножестве 1, а затем просмотрите выходные данные.

	// 传统集合的方式	
    public static void main(String[] args) {
            List<String> names = new ArrayList<>();
            names.add("张三丰");
            names.add("张大宝");
            names.add("张三");
            names.add("德玛杰");
            names.add("乔峰");
            names.add("李大宝");
    
            List<String> list1 = new ArrayList<>(); //以 '张' 开头的字符串
            for (String name:names){
                if (name.startsWith("张")){
                    list1.add(name);
                }
            }
    
            List<String> list2 = new ArrayList<>(); // list1中长度为 3 的字符串
            for (String name:list1){
                if (name.length()==3){
                    list2.add(name);
                }
            }
    
            for (String name:list2){
                System.out.println(name);
            }
    }
	// stream流方式	
      public static void main(String[] args) {
            List<String> names = new ArrayList<>();
            names.add("张三丰");
            names.add("张大宝");
            names.add("张三");
            names.add("德玛杰");
            names.add("乔峰");
            names.add("李大宝");
    
            names.stream().filter(name->name.startsWith("张"))
                .filter(name->name.length()==3).forEach(System.out::println);
        }

можно увидеть сstreamПоточный метод намного проще, чем традиционный метод сбора.


Два способа получить стрим

  • всеCollectionКоллекции могут бытьstream()метод получения потока.
  • Streamстатический метод классаof()Обычно используется для преобразования массивов вstreamпоток.
    public static void main(String[] args) {
        // 集合转成 stream 流
        List<String> list = new ArrayList<>();
        Stream<String> listStream = list.stream();

        Set<Integer> set = new HashSet<>();
        Stream<Integer> setStream = set.stream();

        // 数组转成 stream 流
        String[] names = new String[]{"zs","ls","ww"};
        Stream<String> namesStream = Stream.of(names);

        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
    }

Метод классификации

streamМетоды In-Stream делятся на две категории:

  • Отложенный метод, возвращаемое значение по-прежнемуStreamтип
  • финализатор, возвращаемое значение больше неStreamтипа, например:count()иforEach().

Обычный метод - Фильтр ()

filter()Преобразует поток в другой подпоток, этот метод принимаетPredicate 类型的参数(Один из встроенных функциональных интерфейсов системы).

Stream<T> filter(Predicate<? super T> predicate);

  public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("张三丰");
        names.add("张大宝");
        names.add("张三");
        names.add("德玛杰");
        names.add("乔峰");
        names.add("李大宝");
        
        // 过滤 names 集合,只要姓张的人,然后输出
        names.stream().filter(name->name.startsWith("张")).
        forEach(System.out::println);
    }

Функции потокового вещания - можно использовать только один раз

StreamПотоки - это потоки по трубопроводу,можно использовать только один разКогдаStreamПосле того, как поток вызвал метод финализатора, он будет закрыт.Повторный вызов его метода сообщит об ошибке.

    public static void main(String[] args) {
        // 数组转成 stream 流
        String[] names = new String[]{"zsf","ls","ww"};
        Stream<String> namesStream = Stream.of(names);

        namesStream.filter(name->name.length()==3).
            forEach(System.out::println);
        
        // 流已经被关闭,再次调用
        namesStream.forEach(System.out::println);
    }


Общий метод --map()

Если вам нужно сопоставить элементы из потока с другим потоком, вы можете использоватьmap()Методы обычно используются для преобразования данных одного типа в данные другого типа.

<R> Stream<R> map(Function<? super T, ? extends R> mapper);
    public static void main(String[] args) {
        // 数组转成 stream 流
        String[] strings = new String[]{"1","2","3"};
        Stream<String> stream1 = Stream.of(strings);

        // 使用 map 方法,将字符串类型的整数转成 Integer 类型的整数,然后遍历
        Stream<Integer> stream2 = stream1.map(k->Integer.parseInt(k));
        stream2.forEach(System.out::println);
        
        
    }

Общий метод --limit()

limit()Элементы в потоке могут быть перехвачены, только первые n элементов могут быть перехвачены

   public static void main(String[] args) {
        // 数组转成 stream 流
        String[] strings = new String[]{"1","2","3","4"};

        // 只截取前3个元素,输出
        Stream.of(strings).limit(3).forEach(System.out::println);
    }

Общий метод --skip()

Пропустить первые n элементов в потоке и вернуть поток длины 0, если n больше, чем количество элементов в потоке.

   public static void main(String[] args) {
        // 数组转成 stream 流
        String[] strings = new String[]{"1","2","3","4"};

        //  跳过前2个元素,输出
        Stream.of(strings).skip(2).forEach(System.out::println);
    }

Общий метод --concat()

StreamСтатический метод класса используется для слияния двух потоков.

   public static void main(String[] args) {
        // 数组转成 stream 流
        String[] strings1 = new String[]{"1","2","3","4"};
        String[] strings2 = new String[]{"3","4","5","6"};

        Stream<String> stream1 = Stream.of(strings1);
        Stream<String> stream2 = Stream.of(strings2);

        Stream<String> stream3 = Stream.concat(stream1,stream2);
        stream3.forEach(System.out::println); // 输出 1,2,3,4,3,4,5,6
    }