프로그래밍 언어/Java

[Stream] 필터링, 매핑( flatMapXX(), mapXX(), boxed(), distinct(), filter() ) 관련 스트림 메소드

코딩하는흑구 2019. 9. 17. 20:26

필터링

- 중간처리 기능으로 요소를 걸러내는 역할

- distinct() : 중복을 제거하는 메소드

- filter() : 매개값으로 주어진 Pridicate 객체가 true를 반환하는 요소만 필터.

 

public static void main(String[] args) {
	List<String> names = Arrays.asList("가나다","라마바","가나다","차카타","파하");
    //이름 중복 제외.
	names.stream()
		.distinct()
		.forEach(System.out::println);
	System.out.println();
	
    //"가"로 시작하는 이름만 필터
	names.stream()
		.filter(n->n.startsWith("가"))
		.forEach(System.out::println);
	System.out.println();
	
    //중복 없애고 "라"로 시작하는 요소만 필터
	names.stream()
		.distinct()
		.filter(n->n.startsWith("라"))
		.forEach(System.out::println);
}

결과

가나다
라마바
차카타
파하

가나다
가나다

라마바

 

매핑

- 중간처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업을 한다.

- flatXXX() 와 mapXXX() 그리고 asDoubleStream(), asLongStream(), boxed() 메소드가 있다.

 

- flatXXX() : 요소를 대체하는 복수개의 요소들로 구성된 새로운 스트림을 리턴.

public static void main(String[] args) {
	List<String> input1 = Arrays.asList("java8 lambda","stream mapping");
	input1.stream()
		.flatMap(data -> Arrays.stream(data.split(" ")))
		.forEach(System.out::println);
	
	System.out.println();
	
	List<String> input2 = Arrays.asList("10","20","30","40","50","60");
	input2.stream()
		.flatMapToInt(data -> {
			String[] strArr = data.split(",");
			int[] intArr = new int[strArr.length];
			for(int i =0; i<strArr.length; i++) {
				intArr[i] = Integer.parseInt(strArr[i].trim());
			}
			return Arrays.stream(intArr);
		})
		.boxed()//이걸하고 number 타입을 보면 int/Integer로 바뀜.
		.forEach(number-> System.out.println(number));
}

결과

java8
lambda
stream
mapping

10
20
30
40
50
60

 

- mapXXX() : 요소를 대체하는 요소로 구성된 새로운 스트림 리턴.

- asDoubleStream() : IntStream의 int요소나 LongStream의 long 요소를 double 형 DoubleStream으로 캐스팅하여 반환한다.

- boxed() : primitive 타입을 wrapper 타입으로 박싱하여 반환한다.

public static void main(String[] args) {
		List<Student> studentList = Arrays.asList(
			new Student("가나다",10),
			new Student("라마바",20),
			new Student("사아자",30)
		);
		studentList.stream()
			.mapToInt(Student::getScore) //student 객체가 가진 score값으로 스트림 재생성.
			.boxed() //Integer 타입 Stream으로 변환.
			.forEach(score -> System.out.println(score));
		
		//AsDoubleStreamBoxedExample
		int[] intArray= {1,2,3,4,5};
		
		IntStream intStream = Arrays.stream(intArray);
		intStream
			.asDoubleStream()
			.forEach(d -> System.out.println(d));
		
		System.out.println();
		
		intStream = Arrays.stream(intArray);
		intStream
			.boxed() //Integer로 변환.
			//obj는 Integer 타입.
			.forEach(obj -> System.out.println(obj.intValue()));
	}

결과 

10
20
30


1.0
2.0
3.0
4.0
5.0

1
2
3
4
5