Java 스트림 API 소개

12179 단어 functionaljavastreams
myblog에 처음 발표
Java 스트림 API는 Java8에서 시작합니다.그것으로 데이터에 대한 계산이 간결하고 우아하다는 것을 나타낸다.다음 게시물에서는 Java Stream API를 사용하면 무엇을 실현할 수 있는지 가장 일반적인 방법을 소개합니다.

흐름과 집합


코드에 직접 들어가기 전에, 나는 하류와 집합 사이의 차이를 설명하고 싶다.두 가지 모두 공통된 속성이 있는데, 예를 들면, 그것들은 모두 교체될 수 있다.외부 집합을 통해 교체할 수 있습니다. 예를 들어 for each 순환입니다.반대로, 당신은 흐름 속에서 현식 순환을 하지 않습니다.계산을 함수로 표현하면 스트림 API가 내부에서 반복됩니다.스트리밍 API도 불활성이며 해당 요소는 네트워크를 통해 필요에 따라 계산하거나 가져옵니다.집합은 메모리의 데이터 저장입니다. 이것은 집합의 모든 요소가 계산을 거쳐 RAM에 저장된 후에야 접근할 수 있다는 것을 의미합니다.그러나 이것은 이미 계산된 데이터에 대해 흐름을 사용할 수 없다는 것을 의미하지는 않는다.특정 상황에서, 그것은 집합보다 흐름을 더욱 유연하게 한다.다음 예시에서 보듯이 집합된 데이터 구조를 바탕으로 흐름을 만들 수 있습니다.

예.


다음 글에서, 나는 당신에게 흐름을 사용하는 예시를 보여 주고, 나의 해결 방안과 고전적인 프로그래밍 방법을 비교할 것이다.

필터


목록을 필터하려면 filter 을 사용할 수 있습니다.
만약 우리가 단어 목록을 가지고 있다면.
List<String> words = Arrays.asList("Abra", "Kadrabra", "Aloha");
이제 우리는 대문자 a로 시작하는 모든 단어를 필터해서 출력해야 한다.
words.stream()
        .filter(word -> word.startsWith("A"))
        .forEach(System.out::println);
이곳에서 우리는 실제로 두 가지 흐름 방법을 사용했다.우선, 우리는 목록을 하나의 흐름으로 바꾸고, 대문자 a로 시작하는 단어를 필터합니다. 결과 흐름에 단어 System.out.println 를 출력합니다.
너는 이전에 비슷한 lambda 표현식을 본 적이 있을 것이다. 예를 들어 filter 중의 on을 본 적이 있지만, 너는 내가 forEach 방법에서 사용하는 많은 것을 본 적이 없을 것이다.System.out::println는 다음과 같은 lambda 표현식의 문법사탕에 불과하다. x -> System.out.println(x).
또한 스트림을 사용하지 않고 코드를 작성하여 for 루프를 사용할 수도 있습니다.
for (String word : words) {
        if (word.startsWith("A")) {
            System.out.println(word);
    }
}
내가 보기에 이 해결 방안은 그다지 우아하지 않을 뿐만 아니라, 내가 위의 코드 세션에서 보여준 것처럼 더욱 표현력 있게 작성할 수 있다.
우리는 심지어 외부 방법에서 startsWith 조건을 위한 방법을 만들어서 우리의 흐름 예시를 개선할 수 있다.
words.stream()
        .filter(StreamExamples::startsWithA)
        .forEach(System.out::println);
가지다
private static boolean startsWithA(String word) {
    return word.startsWith("A");
}

합계


흐르는 API가 있으면 너는 다시는 이런 코드를 쓸 필요가 없다
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

int sum = 0;
for (Integer number : numbers) {
    sum += number;
}
System.out.println(sum);
반대로 너는 글을 쓸 수 있다
System.out.println(numbers.stream().mapToInt(Integer::intValue).sum());
위의 코드 세션과 완전히 같습니다.

지도.

map 흐르는 모든 원소를 다른 형식으로 투영한다.mapToInt를 사용하여 원소를 Int에 투영할 때, 나는 맵을 사용하여 흐르는 모든 원소를 새로운 원소에 투영할 수 있다.
numbers.stream()
        .map(number -> number * number)
        .forEach(System.out::println);
이 코드를 작성하는 일반적인 방법은 다음 코드 세그먼트입니다.
for (Integer number : numbers) {
    int squaredNumber = number * number;
    System.out.println(squaredNumber);
}

평면도


다음은 다음과 같은 데이터 원본이 있다고 가정해 봅시다.
List<List<Integer>> matrix = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6));
우리의 현재 임무는 행렬의 모든 요소를 총결하는 것이다.
데이터 구조를 간소화하기 위해 우리는 flatMap를 사용할 수 있다.그것은 흐름을 연결하고 하나의 흐름을 생성한다.계산을 위해 우리는 먼저 flatMap를 사용하여 여러 개의 흐름을 하나의 흐름으로 연결한 다음에 mapToIntsum를 사용할 수 있다. 예를 들어sum의 상례와 같다.
System.out.println(matrix.stream().flatMap(Collection::stream).mapToInt(Integer::intValue).sum());
flatMap for 순환 중의 for 순환을 사용하고 한 줄에 우아한 코드를 작성할 수 있습니다.
만약 당신의 동료가 당신의 코드를 추출한다면 그들은 당신에게 감사할 것입니다.

모으다


마지막으로 가장 중요하지 않은 것은 collect 흐름을 전통적인 데이터 구조로 전환할 수 있다는 것이다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> evenNumbers = numbers.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());

결론


나는 이미 모든 예시를 나의 것으로 올렸다Github
Java 8은 Java Streams를 도입하여 데이터 처리 조회를 간결하고 완선한 방식으로 표현할 수 있도록 합니다.아직 탐색해야 할 조작이 많은데, 이 글은 단지 너에게 흐르는 API를 소개한 것일 것이다.다음에 Java를 사용할 때 스트리밍 API를 사용할 수 있는 역량이 생기길 바랍니다.

좋은 웹페이지 즐겨찾기