오답노트

[Java] 스트림 본문

Java

[Java] 스트림

권멋져 2023. 7. 10. 11:02

스트림

자료의 대상과 관계없이 동일한 연산을 수행하고, 배열, 컬렉션을 대상으로 연산을 수행한다.

단, 한번 생성하고 사용한 스트림은 재사용 할 수 없다.

 

  • 중간 연산 : 중간 연산은 여러 개의 연산이 적용될 수 있다. 하지만 그 결과는 최종 연산이 호출 후에 적용된다. 이를 지연 연산이라고 한다. (ex. filter, map,sorted 등)
  • 최종 연산 : 마지막 한 번만 적용된다. (ex. sum, count, forEach)
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListStreamTest {

	public static void main(String[] args) {
		List<String> sList = new ArrayList<String>();
		sList.add("Tomas");
		sList.add("Edward");
		sList.add("Jack");
		
		Stream<String> strstream = sList.stream();
		strstream.forEach(s -> System.out.println(s));
		
		sList.stream().sorted().forEach(s -> System.out.print(s + "\t"));
		System.out.println();
		sList.stream().map(s->s.length()).forEach(n -> System.out.print(n + "\t"));
		System.out.println();
		sList.stream().filter(s->s.length() >= 5).forEach(s -> System.out.print(s + "\t"));
	}

}

reduce 연산

위에서 사용한 연산과 달리 사용자가 직접 구현한 연산을 적용할 수 있다.

람다식을 구현하거나 람다식이 길면 BinaryOperator를 구현하여 사용할 수 있다.

 

import java.util.Arrays;
import java.util.function.BinaryOperator;

class CompareString implements BinaryOperator<String>{
	@Override
	public String apply(String s1, String s2) {
		if(s1.getBytes().length >= s2.getBytes().length) return s1;
		else return s2;
	}
}

public class ReduceTest {

	public static void main(String[] args) {
		String greetings[] = {"안녕하세요~~~", "Hello", "Goood morning", "반갑습니다"};
		
		System.out.println(Arrays.stream(greetings).reduce("",(s1,s2)->
			{
				if(s1.getBytes().length >= s2.getBytes().length) return s1;
				else return s2;
			}
		));
		
		String str = Arrays.stream(greetings).reduce(new CompareString()).get();
		System.out.println(str);
	}

}

 

 

 

'Java' 카테고리의 다른 글

[Java] 사용자 정의 예외 처리  (0) 2023.07.10
[Java] 예외 처리  (0) 2023.07.10
[Java] 람다식  (0) 2023.07.10
[Java] 지역 내부 클래스와 익명 내부 클래스  (0) 2023.07.10
[Java] 추상화  (0) 2023.07.08