자바 - 자바 8 추가 기능 설명 (Predicate 와 Stream)

42027 단어 자바 핵심 기술
Predicate 인터페이스
Predicate 인터페이스 소개
    Predicate 는 함수 식 인터페이스 로 Lambda 표현 식 을 매개 변수 로 사용 할 수 있 습 니 다.자바 8 은 집합 Collection 에 removeIf(Predicate filter) 방법 을 추가 하여 filter 조건 에 맞 는 모든 요 소 를 대량으로 삭제 할 수 있 습 니 다.
Predicate 인터페이스 사용 사례
Collection 을 테스트 하 는 removeIf() 방법.예제 1) 실행 클래스:
public class DemoApplication {

    public static void main(String[] args) {

        //     
        Collection collection = new HashSet();

        //     
        collection.add("book01");
        collection.add("book02");
        collection.add("book03");
        collection.add("b05");
        collection.add("b06");

        Collection collectionNew = new HashSet();
        //   Lambda           
        collection.forEach(str -> collectionNew.add(str));
        System.out.println("collectionNew: " + collectionNew);

        //   Lambda       (     Predicate)
        collection.removeIf(filter -> ((String)filter).length() < 5);

        //   Lambda       
        collection.forEach(str -> System.out.println(str));

        
        }
}

2) 실행 결과:
collectionNew: [book02, book01, b05, book03, b06]
book02
book01
book03

    상기 결과 에서 우 리 는 Collection 집합 을 호출 하 는 removeIf() 방법 을 볼 수 있 습 니 다. 조건 에 맞 는 길이 가 5 보다 작은 집합 요 소 를 대량으로 걸 러 낼 수 있 습 니 다. 프로그램 은 Lambda 표현 식 에 들 어가 서 걸 러 낼 수 있 습 니 다. collection.removeIf(filter -> ((String)filter).length() < 5);예시 2 Predicate 인 터 페 이 스 를 사용 하 는 boolean test(T t); 방법 1) 도구 클래스 만 들 기:
import java.util.Collection;
import java.util.function.Predicate;

/**
 * @author andya
 * @create 2020-03-24 14:08
 */
public class PredicateUtil {
    public static int countCollectionElement(Collection collection, Predicate predicate){
        int total = 0;
        for (Object object : collection) {
            //  Predicate test()              
            if (predicate.test(object)) {
                total ++;
            }
        }

        return total;
    }
}

2) 실행 클래스:
public class DemoApplication {

    public static void main(String[] args) {

        //     
        Collection collection = new HashSet();

        //     
        collection.add("book_java    ");
        collection.add("book_c++    ");
        collection.add("book_java    ");
        collection.add("book_     ");
        collection.add("book01");
        collection.add("book02");

        Collection collectionNew = new HashSet();
        //   Lambda           
        collection.forEach(str -> collectionNew.add(str));
        System.out.println("collectionNew: " + collectionNew);

        System.out.println("  java      :" +
                PredicateUtil.countCollectionElement(collection, ele -> ((String)ele).contains("java")));
        System.out.println("    7   :" +
                PredicateUtil.countCollectionElement(collection, ele -> ((String)ele).length() < 7));
        System.out.println(" book_      :" +
                PredicateUtil.countCollectionElement(collection, ele -> ((String)ele).startsWith("book_")));
        }
}

3) 실행 결과:
collectionNew: [book02, book01, book_java    , book_java    , book_     , book_c++    ]
  java      :2
    72
 book_      :4

『 8195 』 는 하나의 countCollectionElement() 방법 을 정의 하고 Predicate 동적 전 삼 을 사용 하여 모든 집합 요소 가 여과 조건 에 부합 되 는 지 판단 합 니 다.
Stream 흐름 식 인터페이스
Stream 흐름 식 인터페이스 소개
    Java 8 의 새로운 기능 에는 Stream, IntStream, DoubleStream, LongStream 등 API 도 추가 되 었 습 니 다.모든 스 트림 API 는 Stream. Builder, IntStream. Builder, DoubleStream. Builder, LongStream. Builder 등 해당 하 는 Builder 도 제공 합 니 다.
스 트림 사용 절차
  • Stream 등 API 의 builder() 클래스 방법 으로 Stream 에 대응 하 는 Builder 클래스 를 만 듭 니 다.
  • Builder 의 add() 방법 으로 흐름 에 여러 요 소 를 추가 합 니 다.
  • Builder 의 build() 방법 으로 해당 하 는 Stream 가 져 오기;
  • Stream 집적 방법 호출;

  • 스 트림 사용 예시
    public class DemoApplication {
    
        public static void main(String[] args) {
    
            //  xxxStream builder()     Builder
            IntStream intStream = IntStream.builder()
                    .add(1)
                    .add(-2)
                    .add(3)
                    .add(10)
                    .build();
    
            //     (             ,       ,     )
            System.out.println("intStream       : " + intStream.max().getAsInt());
            System.out.println("intStream       : " + intStream.min().getAsInt());
            System.out.println("intStream       : " + intStream.average());
            System.out.println("intStream      : " + intStream.sum());
            System.out.println("intStream      : " + intStream.count());
            System.out.println("intStream            10: "
                    + intStream.anyMatch(ele -> ele * ele > 10));
            System.out.println("intStream           10: "
                    + intStream.allMatch(ele -> ele * ele * ele > 10));
    
            //       1      Stream
            IntStream intStreamNew = intStream.map(ele -> ele + 1);
            intStreamNew.forEach(ele -> System.out.println(ele));
            }
    }
    

    실행 결과: 상기 집합 방법의 모든 실행 결 과 를 한 안에 넣 고 보 여 줍 니 다. 사실은 한 가지 만 수행 할 수 있 습 니 다.
    intStream       : 10
    intStream       : -2
    intStream       : OptionalDouble[3.0]
    intStream      : 12
    intStream      : 4
    intStream            10true
    intStream           10: false
    2
    -1
    4
    11
    

    상기 예제 에 두 가지 집적 방법 이 존재 한다. '중간 방법' 과 '말단 방법' 이다.
  • 중간 방법: 중간 작업 은 흐름 이 열 린 상 태 를 유지 하고 후속 방법 을 직접 호출 할 수 있 습 니 다. 예 를 들 어 map() 방법 은 반환 값 이 다른 흐름 입 니 다.
  • 말단 방법: 말단 방법 은 대류 에 대한 최종 조작 이다. 예 를 들 어 sum() 방법 이 실 행 된 후에 흐름 은 사용 할 수 없다. 만약 에 다시 사용 하면 잘못 보고 할 수 있다 Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
  • Stream 의 일반적인 방법
    중간 방법
  • filter(Predicate predicate): 필터 Stream 에서 predicate 필터 조건 에 부합 되 지 않 는 요소 입 니 다.
  • mapToXxx(ToXxxFunction mapper): ToXxFunction 을 사용 하여 대류 중의 요 소 를 1 대 1 로 전환 합 니 다. 방법 은 새로운 흐름 에 ToXxFunction 전환 이 생 성 된 모든 요 소 를 포함 하고 있 습 니 다.
  • peek(Consumer action): 각 요 소 를 순서대로 조작 하고 돌아 오 는 흐름 은 기 존 흐름 과 같은 요 소 를 포함 하여 디 버 깅 에 사용 합 니 다.
  • distinct(): 흐름 에 중복 되 는 모든 요 소 를 정렬 하고 상태 가 있 는 방법;
  • sorted(): 흐름 속 의 요소 가 후속 방문 에서 질서 있 는 상태 에 있 는 것 을 확보 하 는 데 사용 되 는 것 도 상태 가 있 는 방법 이다.
  • limit(long maxSize): 이 흐름 에 대한 후속 방문 에서 최대 접근 이 허용 되 는 요소 의 개 수 를 확보 하 는 데 사용 되 며 상태 적 이 고 단락 적 인 방법 입 니 다.

  • 말단 방법
  • forEach(Consumer action): 흐 르 는 모든 요 소 를 옮 겨 다 니 며 action 을 수행 합 니 다.
  • toArray(): 흐름 속 의 모든 요 소 를 하나의 배열 로 변환 합 니 다.
  • reduce(): 특정한 조작 이 흐름 속 요 소 를 합병 하 는 데 사용 합 니 다.
  • min(): 흐름 속 요소 의 최소 치 를 되 돌려 줍 니 다.
  • max(): 흐름 속 요소 의 최대 치 를 되 돌려 줍 니 다.
  • sum(): 흐름 속 요소 의 총 화 를 되 돌려 줍 니 다.
  • count(): 흐름 에 있 는 모든 요소 의 수량 을 되 돌려 줍 니 다.
  • anyMatch(Predicate predicate): 흐름 에 최소한 하나의 요소 가 predicate 여과 조건 에 부합 되 는 지 판단 합 니 다.
  • allMatch(Predicate predicate): 흐름 중의 모든 요소 가 predicate 여과 조건 에 부합 되 는 지 판단 합 니 다.
  • noneMatch(Predicate predicate): 흐름 중의 모든 요소 가 predicate 여과 조건 에 부합 되 지 않 는 지 판단 합 니 다.
  • findFirst(): 흐름 의 첫 번 째 요 소 를 되 돌려 줍 니 다.
  • findAny(): 흐름 속 의 임의의 원 소 를 되 돌려 줍 니 다.

  • Collection 의 stream () 방법
    public class DemoApplication {
    
        public static void main(String[] args) {
       		//     
            Collection collection = new HashSet();
    
            //     
            collection.add("book_java    ");
            collection.add("book_c++    ");
            collection.add("book_java    ");
            collection.add("book_     ");
            collection.add("book01");
            collection.add("book02");
            collection.forEach(ele -> System.out.println(ele));
    
            System.out.println("-------------------------------------");
    
            System.out.println("  java      :"
                    + collection.stream().filter(ele -> ((String)ele).contains("java")).count());
            System.out.println("    7   :"
                    + collection.stream().filter(ele -> ((String)ele).length() < 7).count());
            System.out.println(" book_      :"
                    + collection.stream().filter(ele -> ((String)ele).startsWith("book_")).count());
    
            System.out.println("-------------------------------------");
    
            //   Collection stream()        Stream;
            //   Stream mapToInt()    Stream   IntStream  ;
            //    forEach()    IntStream    。
            Collection collectionLength = new ArrayList();
            collection.stream().mapToInt(ele -> ((String)ele).length())
                    .forEach(ele -> ((ArrayList) collectionLength).add(ele));
            //   collectionLength.forEach(ele -> System.out.println(ele));
            collectionLength.forEach(System.out::println);
            }
    }
    

    실행 결과
    book02
    book01
    book_java    
    book_java    
    book_     
    book_c++    
    -------------------------------------
      java      :2
        72
     book_      :4
    -------------------------------------
    6
    6
    13
    13
    10
    12
    

        collection.stream().filter(Predicate super T> predicate).count() 이런 방식 으로 글 에서 앞에서 만 든 PredicateUtil 방법 을 바 꿀 수 있 습 니 다.stream() 방법 은 다음 과 같다.
        default Stream<E> stream() {
            return StreamSupport.stream(spliterator(), false);
        }
    
    filter() 방법 은 다음 과 같다.
        Stream<T> filter(Predicate<? super T> predicate);
    

    * 8195: 8195: Stream 스 트림 인 터 페 이 스 를 직접 사용 하여 Collection 집합 요 소 를 처리 하 는 것 을 제외 하고 우 리 는 Collection 인터페이스 stream() 방법 으로 집합 에 대응 하 는 흐름 을 되 돌 릴 수 있다.절 차 는 다음 과 같다.
  • Collection 의 stream() 방법 을 먼저 호출 하여 집합 을 Stream 으로 전환시킨다.
  • Stream 의 mapToInt() 방법 으로 Stream 대상 의 IntStream 대상 을 얻 기;
  • 마지막 호출 forEach() 방법 으로 IntStream 의 요 소 를 옮 겨 다 닙 니 다.

  • 참고서 '미 친 자바'

    좋은 웹페이지 즐겨찾기