관리 메뉴

나만의공간

Java Stream Operation 기능 #1 본문

IT/JAVA

Java Stream Operation 기능 #1

밥알이 2024. 3. 6. 14:32

자바 Stream에 기본사용법에 대한 설명을 진행하였고, 이제는 Stream에서 제공하는 기본적인 Operations 종류들에 대해서 알아보고자 합니다.
Stream에는 유용한 기능들이 많이 제공됩니다.

count() & distinct()

  • count(): Stream 객체의 요소 개수를 반환합니다.
  • distinct(): Stream 객체의 중복을 제거한 새로운 Stream을 반환 합니다. 중복이 제거한 후에 반환된 Stream은 새로운 객체가 됩니다.
package jpabook.jpashop.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamCount {

	public static void main(String[] args) {
		Stream<String> stream = Stream.of("가","나","다","라","마","바");
		long streamCnt = stream.count();
		System.out.println("=========================");
		System.out.println("Stream 객체 Cnt: " + streamCnt);
		System.out.println("=========================");

		List<String> list = new ArrayList<>();
		arrayListSetting(list,"가","나","다","라","마","바");
		long listStreamCnt = list.stream().count();
		System.out.println("=========================");
		System.out.println("list 객체 Cnt: " + listStreamCnt);
		System.out.println("=========================");

		List<String> list2 = new ArrayList<>();
		arrayListSetting(list2,"가","나","다","라","마","바","가","나","다","라","마","바");
		System.out.println("========중복 제거건 Stream =======");
		list2.forEach(System.out::print);
		Stream distinctList2 = list2.stream().distinct();
		System.out.println("");
		System.out.println("========중복 제거후 Stream =======");
		distinctList2.forEach(System.out::print);
	}

	public static void arrayListSetting(List list, String... values) {
		for (String value:values) {
			list.add(value);
		}
	}
}

결과값

=========================
Stream 객체 Cnt: 6
=========================
=========================
list 객체 Cnt: 6
=========================
========중복 제거건 Stream =======
가나다라마바가나다라마바
========중복 제거후 Stream =======
가나다라마바

Iterating(반복)

  • Stream API는 for, for-each, while 반복문을 대체하는 API를 제공합니다. 이러한 기능제공으로 개발자는 로직 개발에 집중할 수 있게 됩니다.
  • List에 있는 문자가 존재하는지 찾는 방법을 기존 for-each과 Stream으로 작성이 차이점을 볼수 있습니다.
package jpabook.jpashop.stream;

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

public class StreamIterating {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("사과","배","대추","감","귤","수박");
		//기존 foreach문법
		boolean forBoolean = forEachMethod(list);
		System.out.println("foreach 사용 (대추가 있나여?) "+forBoolean);

		//Stream을 활용한 방법
		boolean streamBoolean = streamMethod(list);
		System.out.println("stream 사용 (대추가 있나여?) "+streamBoolean);

	}

	//기존 foreach문법
	public static boolean forEachMethod(List<String> list) {
		for (String str: list) {
			if (str.contains("대추")){
				return true;
			}
		}
		return false;
	}

	//Stream으로 변경
	public static boolean streamMethod(List<String> list) {
		boolean isContain = list.stream().anyMatch(element -> element.contains("대추"));
		return isContain;
	}
}

결과값

foreach 사용 (대추가 있나여?) true
stream 사용 (대추가 있나여?) true

Filtering (필터기능)

  • Filter() 메서드는 컬렉션 또는 배열과 같은 요소들을 처리할때, 특정 조건을 만족하는 요소들만을 분리하는데 사용됩니다.
    예를 들어 과일에 이름이 2자 이상인 과일만 가져오려고 할때 filter() 메서드를 사용하면 유용합니다.
package jpabook.jpashop.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamFilter {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("사과","배","대추","감","귤","수박","단호박","밤");
		System.out.println("========= List 원본 ==========");
		list.forEach(element -> System.out.print(element+" "));
		System.out.println("");

		List<String> twoList = list.stream().filter(element -> element.length()>=2).collect(Collectors.toList());
		System.out.println("=== 과일이름 두 글자 이상 리스트 ===");
		twoList.forEach(System.out::println);
	}
}

결과값

========= List 원본 ==========
사과 배 대추 감 귤 수박 단호박 밤 
=== 과일이름 두 글자 이상 리스트 ===
사과
대추
수박
단호박

Mapping

  • map() 메서드는 Stream내의 각 요소를 특정한 함수에 적용하여 새로운 요소로 변환하는데 사용합니다.
    변환된 요소들로 이루어진 새로운 Stream을 반환해 줍니다.
  • map() 메서드에서 반환되는 종류는 다음과 같습니다.
    • 원시 타입 스트림 (Primitive Stream): IntStream, LongStream, DoubleStream 등의 원시 타입 스트림을 반환할 수 있습니다. 예를 들어, IntStream은 정수형 요소를 처리하는 스트림입니다.
    • 객체 타입 스트림 (Object Stream): Stream<T> 형태의 객체 타입 스트림을 반환할 수 있습니다. 여기서 T는 제네릭 타입으로, 리스트의 요소 타입에 따라 결정됩니다. 예를 들어, List<Integer>에서 Integer 타입의 스트림을 반환합니다.
package jpabook.jpashop.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamMap {

	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
		System.out.println("===== 원래값 =====");
		list.stream().forEach(element -> System.out.print(element+" "));
		System.out.println(" ");
		System.out.println("===== 변경값 =====");
		// 기본값에 두배한 리스트를 반환한다.
		List<Integer> doubleList = list.stream().map(element -> element * 2).collect(Collectors.toList());
		doubleList.stream().forEach(element-> System.out.print(element+" "));
	}
}

결과값

===== 원래값 =====
1 2 3 4 5 6 7  
===== 변경값 =====
2 4 6 8 10 12 14

'IT > JAVA' 카테고리의 다른 글

Java Stream 다양한 생성방법  (0) 2024.03.08
Java Stream 소개 #1  (0) 2024.02.27
WebClient 사용법 (ConnectionProvider 사용법)  (0) 2024.02.26
CheckedException 과 unCheckedException 설명  (0) 2024.02.22
Intellij CheckStyle 적용하기  (0) 2023.03.17
Comments