Как работают методы потокового интерфейса в java?

Недавно я изучал возможности Java 8, поэтому начал с лямбда-выражения, затем наткнулся на потоковый API Java, теперь я пытаюсь разобраться в методах потокового API. Как они работают?

Что я понял о лямбда-выражении, так это то, что если мы хотим передать лямбда-выражение методу, нам нужно создать интерфейс с одним нереализованным методом (интерфейс Java 8 может иметь реализацию по умолчанию), который соответствует сигнатуре лямбда-выражения. то метод, которому передается лямбда-выражение, может выполнить лямбда-выражение, вызвав метод интерфейса. Так что я могу сказать, что лямбда-выражение работает как реализация метода интерфейса.

Но когда я увидел Stream API, у него есть некоторые методы, которые изменяют поток, например, ниже код просто печатает целые числа, фильтруя целые числа меньше 5.

import java.util.Arrays;
import java.util.List;


public class StreamDemo {
   static List<Integer> list= Arrays.asList(new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6));
    public static void main(String[] ar) {
        list.parallelStream()
                .filter( x-> x<5)
                .forEach(System.out::print);
    }
}

Но я не понимаю, как работает фильтр, поскольку у него нет реализации, я попытался увидеть реализацию от Intellij, которая ведет меня к интерфейсу Stream, где фильтр является нереализованным методом, который принимает ссылку на параметр Predicate, но есть нет вызова метода предиката boolean test(T t);, так как Java оценивает результат, аналогично есть метод distinct, который не имеет реализации, но все же дает мне точный результат.

Заранее спасибо.


person Akshay    schedule 28.05.2017    source источник
comment
filter имеет реализацию, в данном случае она предоставляется экземпляром Stream, возвращенным parallelStream(). Вы можете найти все реализации метода интерфейса, щелкнув маленькую зеленую стрелку вниз на поле рядом с определением.   -  person Oliver Charlesworth    schedule 28.05.2017
comment
Спасибо за быстрый совет, но я не могу перейти к отдельному определению метода   -  person Akshay    schedule 28.05.2017
comment
@AkshayNaik вам не нужно знать, какой класс реализует этот метод и как он реализован. Все, что вам нужно знать, это то, что Stream, какой бы ни была его конкретная реализация, имеет метод different(), который работает, как описано в javadoc интерфейса Stream.   -  person JB Nizet    schedule 28.05.2017


Ответы (1)


Stream — это просто интерфейс, как и List. Во время выполнения Java выбирает реализацию, которая выполняет эту работу. Если вам интересно, как реализован метод фильтра, у вас есть пример в java.util.stream.ReferencePipeline#filter.

Надеюсь, это ответит на ваш вопрос.

person Sir4ur0n    schedule 28.05.2017
comment
Спасибо за точный ответ, но у меня все еще остается два вопроса. 1. Как вызывается метод фильтра без понижения приведения, поскольку поток реализован с помощью ReferencePipeline 2. ReferencePipeline не имеет реализации отдельного метода - person Akshay; 28.05.2017
comment
Хорошо, теперь понятно, метод потока дает объект ReferencePipeline, и, поскольку методы имеют интерфейс потока, нет необходимости понижать значение объекта. Спасибо @jdebon - person Akshay; 28.05.2017