Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

코드 예제가 포함된 Java 8 스트림 자습서

이 블로그 게시물에서는 Java 8 Streams 기능에 대해 논의하고 다양한 코드 예제를 제공할 것입니다.

Java Streams는 함수형 프로그래밍을 Java로 가져오고 Java 8부터 지원되므로 이전 버전의 Java가 있는 경우 Java Streams를 사용하려면 Java 8로 업그레이드해야 합니다.

Java 스트림을 사용하는 이유

스트림의 장점:

  • 스트림은 당신을 보다 효율적인 자바 프로그래머로 만들어 줄 것입니다.
  • 일종의 일회용 함수인 람다 식을 많이 사용합니다.
  • ParallelStreams를 사용하면 대규모 데이터 세트에 대한 다중 스레드 작업을 매우 쉽게 수행할 수 있습니다.

스트림 파이프라인

대부분의 경우 스트림 파이프라인은

  • 출처 (데이터가 유출되는 곳)
  • 0개 이상의 중간 작업이 뒤따릅니다.
  • 및 하나의 터미널 작업

코드 예제가 포함된 Java 8 스트림 자습서

소스는 요소 스트림을 스트리밍합니다.

해당 요소 스트림을 필터링, 정렬하거나 매핑하거나 각 요소에 다른 일련의 다른 작업을 적용할 수 있습니다.

결국에는 수집하거나 축소하거나 다른 터미널 작업을 수행할 수 있지만 하나의 터미널 작업만 수행됩니다.

스트림 소스

스트림 소스 컬렉션, 목록, 집합, int 배열, long, double, 문자열 등에서 올 수 있습니다.

스트림 작업

스트림 작업 중간 또는 터미널:

  • 중간 작업 필터, 매핑 또는 정렬과 같은 기능은 여러 중간 작업을 연결할 수 있도록 스트림을 반환합니다.
  • 터미널 작업 스트림을 수신하면 void를 반환하거나 축소와 같은 비 스트림 결과를 반환할 수 있습니다. 항목을 목록으로 줄입니다.

중급 작업

  • 0개 이상의 중간 작업이 허용됩니다.
  • 순서가 중요합니다. 대규모 데이터세트의 경우:먼저 필터링 그런 다음 정렬하거나 매핑합니다.
  • 매우 큰 데이터 세트의 경우 ParallelStream을 사용하여 여러 스레드를 활성화합니다.

일부 중간 작업은 다음과 같습니다.

  • anyMatch()
  • 별도()
  • 필터()
  • 첫 번째 찾기()
  • 플랫맵()
  • 지도()
  • 건너뛰기()
  • 정렬()

터미널 작업

터미널 작업은 하나만 허용됩니다.

  • forEach는 각 요소에 동일한 기능을 적용합니다. 예를 들어 각 요소를 인쇄합니다.
  • collect는 모든 요소를 ​​컬렉션이나 목록 또는 배열에 저장합니다.
  • 다른 모든 옵션은 스트림을 단일 요약 요소로 줄입니다.

축소 기능의 몇 가지 예는 다음과 같습니다.

  • 카운트()
  • 최대()
  • 최소()
  • 감소()

자바 스트림 코드 예

이제 코드 예제에서 위의 개념을 살펴보겠습니다.

정수 스트림

첫 번째 예는 정수 스트림입니다. IntStream을 사용하여 정수 스트림을 만들 것입니다. 클래스와 정수 범위를 제공하는 범위 함수.

forEach 우리의 터미널 작업입니다. 각 항목에 대해 인쇄해 보겠습니다.

import java.io.IOException;
import java.util.stream.IntStream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        IntStream
            .range(1, 10)
            .forEach(System.out::print);
        System.out.println();
    }
}

출력:

123456789

건너뛰기가 있는 정수 스트림

두 번째 예는 정수 스트림을 사용하지만 skip()를 추가했습니다. 여기서는 스트림의 처음 5개 요소를 건너뛸 것입니다.

이것은 6부터 9까지의 요소만 인쇄합니다. 또한 간단한 람다 표현식을 사용하여 항목을 인쇄합니다.

import java.io.IOException;
import java.util.stream.IntStream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        IntStream
            .range(1, 10)
            .skip(5)
            .forEach(x -> System.out.println(x));
        System.out.println();
    }
}

출력:

6
7
8
9

합계가 있는 정수 스트림

세 번째 예에서는 다시 IntStream을 사용합니다. 그러나 객체 스트림을 생성하기 위해 println() 안에 넣습니다. 문을 인쇄 라인의 매개변수로 사용합니다.

우리가 인쇄할 것은 범위 1에서 5까지의 합계입니다. 즉, 1 2 3 &4는 해당 숫자의 합계만 인쇄할 것입니다.

import java.io.IOException;
import java.util.stream.IntStream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        System.out.println(
        IntStream
            .range(1, 5)
            .sum());
        System.out.println();
    }
}

출력:

10

Stream.of

다음 예제는 Stream.of를 사용합니다. 이 함수는 정수, 부동 소수점 값, 문자열 또는 개체를 스트리밍할 수 있기 때문에 정말 편리합니다.

이 예에서는 알파벳순으로 정렬한 다음 findFirst()를 사용하여 첫 번째 항목을 찾습니다. 기능. 그런 다음 목록의 첫 번째 항목을 인쇄합니다.

import java.io.IOException;
import java.util.stream.Stream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        Stream.of("Ava", "Aneri", "Alberto")
            .sorted()
            .findFirst()
            .ifPresent(System.out::println);
    }
}

출력

Alberto

배열에서 스트림, 정렬, 필터링 및 인쇄

다음 예에서는 배열에서 스트리밍할 것입니다. 그런 다음 정렬하고 필터링한 다음 인쇄합니다.

여기서는 s로 시작하는 항목만 필터링하겠습니다. .

X를 취하는 람다 표현식을 사용합니다. 각각의 이름이고 s로 시작하는 이름을 확인합니다. 그리고 그것을 전달할 것입니다.

그런 다음 정렬한 다음 해당 정렬을 통과하는 각 항목에 대해 인쇄합니다.

import java.io.IOException;
import java.util.Arrays;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        String[] names = {"Al", "Ankit", "Kushal", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah"};
        Arrays.stream(names)
                .filter(x -> x.startsWith("S"))
                .sorted()
                .forEach(System.out::println);
    }
}

출력:

Sarah
Sarika
Shivika

정수 배열의 평균

이제 int 배열의 squares의 평균을 구하는 방법을 살펴보겠습니다.

여기에서는 Arrays.stream()을 사용합니다. 함수를 사용하여 정수를 스트리밍한 다음 map()을 사용할 것입니다. 각 항목을 정사각형에 매핑합니다.

import java.util.Arrays;

public class JavaStreams {
    public static void main(String[] args) {
        Arrays.stream(new int[] {2, 4, 6, 8, 10})
                .map(x -> x * x)
                .average()
                .ifPresent(System.out::println);
    }
}

출력:

44.0

정수 대신 double을 출력합니다.

목록에서 스트림, 필터링 및 인쇄

이 예에서는 목록에서 스트리밍하고 해당 항목을 필터링한 다음 인쇄합니다.

map() 내에서 함수를 사용하면 모든 이름을 소문자로 변환합니다.

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

public class JavaStreams {
    public static void main(String[] args) {
        List<String> people = Arrays.asList("Al", "Ankit", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah");
        people
                .stream()
                .map(String::toLowerCase)
                .filter(x -> x.startsWith("a"))
                .forEach(System.out::println);
    }
}

출력:

al
ankit
amanda

a로 시작하는 세 개의 이름이 있음을 알 수 있습니다. 모두 소문자입니다.

텍스트 파일에서 행 스트림, 정렬, 필터링 및 인쇄

다음 예제에서는 텍스트 파일에서 행을 스트리밍할 것입니다. 우리는 정렬, 필터링 및 인쇄할 것입니다.

bands.txt라는 파일이 있다고 가정해 보겠습니다. 아래에 표시된 내용과 함께:

Rolling Stones
Lady Gaga
Jackson Browne
Maroon 5
Arijit Singh
Elton John
John Mayer
CCR
Eagles
Pink
Aerosmith
Adele
Taylor Swift

Files.lines()를 사용할 것입니다. 파일의 각 줄에 대한 문자열 스트림을 제공할 스트림을 생성합니다.

스트림이 생성되면 이를 정렬하고 13자를 초과하는 항목을 필터링한 다음 남은 항목을 인쇄합니다.

마지막으로 bands.close를 수행하도록 파일을 닫아야 합니다. .

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        Stream<String> bands = Files.lines(Paths.get("bands.txt"));
        bands
                .sorted()
                .filter(x -> x.length() > 13)
                .forEach(System.out::println);
        bands.close();
    }
}

출력:

Jackson Browne
Rolling Stones

13자 이상인 밴드가 두 개 있습니다.

텍스트 파일에서 행 스트리밍 및 목록에 저장

이 예에서는 위와 동일한 텍스트 파일을 사용합니다.

jit 문자가 포함된 항목을 필터링하려고 합니다. , x.contains() 사용 이것은 단지 문자열 함수입니다.

.collect() 사용 jit 문자가 있는 모든 항목을 추가합니다. 목록으로 이동합니다.

목록이 나오면 forEach를 사용할 수 있습니다. 연산자를 사용하여 항목을 인쇄합니다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        List<String> bands2 = Files.lines(Paths.get("bands.txt"))
                .filter(x -> x.contains("jit"))
                .collect(Collectors.toList());
        bands2.forEach(x -> System.out.println(x));
    }
}

출력:

Arijit Singh

CSV 파일 및 개수의 스트림 행

이 예에서는 CSV 파일에서 행을 스트리밍하고 좋은 행을 계산합니다.

data.txt라는 파일이 있다고 가정합니다. 다음 내용으로:

A,12,3.7
B,17,2.8
C,14,1.9
D,23,2.7
E
F,18,3.4

여기서 행 E에는 데이터가 없으므로 스트림에서 해당 데이터를 제외하려고 합니다.

다음 코드에서는 각 행을 읽은 다음 쉼표를 배열로 분할하여 각 행이 항목 배열이 되도록 해야 합니다.

그런 다음 필터를 적용하여 3개의 항목이 없는 행을 필터링합니다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class JavaStreams {
    public static void main(String[] args) throws IOException {
        Stream<String> rows1 = Files.lines(Paths.get("data.txt"));
        int rowCount = (int)rows1
                .map(x -> x.split(","))
                .filter(x -> x.length == 3)
                .count();
        System.out.println(rowCount + " rows.");
        rows1.close();
    }
}

출력:

5 rows

감소 - 합계

이 예에서는 축소를 사용하는 방법을 보여줍니다. 우리는 합계로 줄일 것입니다. 여기에 Stream.of()를 사용하는 이중 스트림이 있습니다. 기능. 세 개의 다른 인수에 세 개의 double을 정의했으며 reduce 함수를 사용할 것입니다.

import java.util.stream.Stream;

public class JavaStreams {
    public static void main(String[] args) {
        double total = Stream.of(7.3, 1.5, 4.8)
                .reduce(0.0, (Double a, Double b) -> a + b);
        System.out.println("Total = " + total);
    }
}

출력:

13.600000000000001