내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java 8에는 많은 새로운 기능이 도입되었으며 그 중 가장 주목할만한 기능은 Lambda 표현식과 Stream API입니다. Stream API는 수집 데이터를 처리하는 효율적이고 간결한 방법을 제공하여 코드를 더욱 간결하고 명확하게 만들고 높은 가독성과 유지 관리성을 제공합니다. 이 기사에서는 기본 개념, 일반적인 작업, 병렬 처리, 실제 사례 및 모범 사례를 포함하여 Java Stream API의 사용을 자세히 살펴봅니다.
Stream API는 데이터를 선언적 방식(SQL 문과 유사)으로 처리할 수 있도록 하는 컬렉션 데이터 처리를 위해 Java 8에 도입된 추상화입니다. Stream API는 컬렉션에 대한 필터링, 정렬, 매핑, 축소 및 기타 작업에 사용할 수 있는 많은 강력한 작업을 제공하여 코드를 크게 단순화합니다.
Stream API는 Stream을 생성하는 다양한 방법을 제공합니다.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream.of
:Stream<String> stream = Stream.of("a", "b", "c");
Stream.generate
:Stream<Double> stream = Stream.generate(Math::random).limit(10);
Stream.iterate
:Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
중간 작업은 Stream을 변환하는 데 사용되며 느리게 평가됩니다. 일반적인 중간 작업은 다음과 같습니다.
filter
: 요소를 필터링하는 데 사용됩니다.Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
map
: 각 요소를 해당 결과에 매핑하는 데 사용됩니다.Stream<String> stream = list.stream().map(String::toUpperCase);
flatMap
: 각 요소를 Stream으로 변환한 후 하나의 Stream으로 병합하는데 사용됩니다.Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
distinct
: 중복을 제거하는데 사용됩니다.Stream<String> stream = list.stream().distinct();
sorted
: 정렬에 사용됩니다.Stream<String> stream = list.stream().sorted();
peek
: 처리 중 각 요소를 확인하는데 사용됩니다.Stream<String> stream = list.stream().peek(System.out::println);
터미널 작업은 Stream 계산을 시작하고 결과를 생성하는 데 사용됩니다. 일반적인 터미널 작업은 다음과 같습니다.
forEach
: 각 요소에 대해 작업을 수행합니다.list.stream().forEach(System.out::println);
collect
: Stream을 다른 형태로 변환합니다.List<String> result = list.stream().collect(Collectors.toList());
reduce
: 스트림의 요소를 값으로 줄입니다.Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
toArray
: 스트림을 배열로 변환합니다.String[] array = list.stream().toArray(String[]::new);
count
: 요소의 개수를 셉니다.long count = list.stream().count();
anyMatch
、allMatch
、noneMatch
: 매칭 판정에 사용됩니다.boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("a"));
findFirst
、findAny
: 요소를 찾는 데 사용됩니다.Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
사용sorted
이 메서드는 스트림을 정렬하고 비교기를 전달할 수 있습니다.
List<String> list = Arrays.asList("b", "c", "a");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
// 逆序排序
List<String> sortedListDesc = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
사용filter
Stream의 요소를 필터링하는 방법입니다.
List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
사용map
메서드는 스트림의 요소를 매핑합니다.
List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
사용reduce
스트림의 요소를 줄이는 방법입니다.
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
사용collect
메서드는 Stream을 다른 형식으로 변환합니다.
List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
Set<String> collectedSet = list.stream().collect(Collectors.toSet());
String joinedString = list.stream().collect(Collectors.joining(","));
병렬 스트림은 멀티 코어 CPU의 장점을 최대한 활용하여 데이터 처리 효율성을 향상시킬 수 있습니다.사용할 수 있다parallelStream
메소드는 병렬 스트림을 생성합니다.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
또한 사용할 수 있습니다parallel
메소드는 일반 스트림을 병렬 스트림으로 변환합니다.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
병렬 스트림이 직렬 스트림보다 항상 빠른 것은 아니며 특정 상황에 따라 테스트해야 한다는 점에 유의해야 합니다.
문자열 컬렉션이 주어지면 길이가 3보다 작은 문자열을 필터링하고 나머지 문자열을 대문자로 변환합니다.
List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
List<String> result = list.stream()
.filter(s -> s.length() >= 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出:[ABC, ABCD]
정수 집합이 주어지면 모든 정수의 평균을 계산합니다.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream()
.mapToInt(Integer::intValue)
.average();
average.ifPresent(System.out::println); // 输出:3.0
스트림 API 사용
파일 내용을 읽고 콘솔에 출력합니다.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
파일 내용을 읽고 각 단어의 발생 횟수를 계산합니다.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
Map<String, Long> wordCount = lines
.flatMap(line -> Arrays.stream(line.split("\W+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
wordCount.forEach((word, count) -> System.out.println(word + ": " + count));
} catch (IOException e) {
e.printStackTrace();
}
데이터베이스 테이블이 있다고 가정해 보겠습니다.users
, 필드 포함id
、name
그리고age
. Stream API를 사용하여 쿼리 결과를 처리할 수 있습니다.
List<User> users = queryDatabase();
List<String> names = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
Collectors
이 클래스에서는 다양한 컬렉터를 제공하며, 특정 요구 사항에 따라 적절한 컬렉터를 선택할 수 있습니다.스트림을 한 번 사용하면 다시 사용할 수 없습니다. 재사용해야 하는 경우 사용하기 전에 스트림을 컬렉션으로 변환하는 것이 좋습니다.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
병렬 스트림은 직렬 스트림보다 항상 빠른 것은 아니며 사례별로 테스트해야 합니다.사용할 수 있다ForkJoinPool
병렬 스트림의 성능을 최적화합니다.
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
list.parallelStream().forEach(System.out::println)
).get();
Stream API를 사용하여 대량의 데이터를 처리할 경우 메모리 누수 문제에 주의할 필요가 있습니다.사용할 수 있다close
스트림을 닫는 방법 또는 사용try-with-resources
문은 스트림을 자동으로 닫습니다.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
이 기사에서는 기본 작업, 고급 작업, 병렬 처리, 실제 사례 및 모범 사례를 포함하여 Java Stream API의 사용을 자세히 소개합니다. Stream API를 합리적으로 활용함으로써 개발자는 코드를 크게 단순화하고 코드의 가독성과 유지 관리성을 향상시키며 데이터 처리 효율성도 향상시킬 수 있습니다. 이 기사가 Java 개발에서 Stream API를 사용하는 데 도움이 되기를 바랍니다.
Java Stream API는 다양한 연산을 유연하게 활용하여 효율적인 데이터 처리와 스트리밍 컴퓨팅을 달성할 수 있는 강력한 컬렉션 데이터 처리 도구입니다. Stream API를 사용해 본 적이 없다면, 이 강력한 도구를 가능한 한 빨리 배우고 익히고 프로젝트에 적용하여 개발 효율성과 코드 품질을 향상시키는 것이 좋습니다.