Недавно я изучал возможности 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
, который не имеет реализации, но все же дает мне точный результат.
Заранее спасибо.
filter
имеет реализацию, в данном случае она предоставляется экземпляромStream
, возвращеннымparallelStream()
. Вы можете найти все реализации метода интерфейса, щелкнув маленькую зеленую стрелку вниз на поле рядом с определением. - person Oliver Charlesworth   schedule 28.05.2017