람다와 스트림(Lamda & Stream)
람다와 스트림
람다 표현식
: 메서드 없이 식으로 표현하는 것.
[일반적인 java 메서드]
반환타입 메서드이름 (매개변수) {
실행문
}
[람다 표현식]
(매개변수) -> {실행문}
interface Cal {
public abstract int sum (int a, int b);
}
public class Test {
public static void main(String[] args) {
// [일반식]
Cal c = new Cal() {
public int sum(int a, int b) {
return a + b;
}
}
System.out.println(c.sum(1,2));
// [람다표현식]
Cal c = (a, b) -> {return a+b;};
System.out.println(c.sum(1,2));
}
}
- 장점: 간결해짐
- 단점:
- 재사용 불가
- 인터페이스에 메서드가 2개 이상인 경우 사용 불가
스트림
: 배열, 컬렉션 등의 데이터를 하나씩 참조하여 처리하는 기능을 가진 클래스
데이터소스객체.Stream생성().중개연산().최종연산();
1) 스트림 생성
-
배열 스트림
String[] str = new String[]{"A", "B", "C"}; Stream stream = Arrays.stream(str);
-
컬렉션 스트림
ArrayList list = new ArrayList(Arrays.asList(1,2,3)); Stream stream = list.stream();
-
streamBuilder
Stream streamBuilder = Stream.builder().add(1).add(2).add(3).build(); // 1,2,3을 순서대로 추가하기.
-
streamGenerate
Stream streamGenerate = Stream.generate( () -> "123" ).limit(3); // 결과물은 총 3개. 123을 반복.
-
streamIterate
Stream streamIterate = Stream.iterate(10, n->n*2).limit(3); // 결과물은 총 3개. 초기값 10, 그리고 다음 값은 2배씩.
-
range
IntStream intstream = IntStream.range(1, 5); // 1~4까지 정수데이터 추가
2) 중개연산
-
filter: 조건에 맞는 요소 추출
IntStream intStream = IntStream.range(1,10).filter(n->n%2==0); // 1~9까지 수 중에서 2로 나눈 나머지가 0인 데이터 추출 // 2, 4, 6, 8이 추출
-
map: 연산을 요소별로 수행
IntStream intStream = IntStream.range(1,10).map(n->n+1); // 1~9까지 맵에 들어있는 수들을 각 요소별로 1씩 더하기 // 2~10까지로 바뀜
-
sort
IntStream intStream = IntStream.builder().add(5).add(3).add(1).add(2).add(4).build(); IntStream intSort = intStream.sorted(); // intSort에 1~5까지 오름차순으로 정렬
3) 최종연산
-
Sum, Average
int sum = IntStream.range(1,5).sum(); // 10 double avg = IntStream.range(1,5).average().getAsDouble(); // 2.5
-
Min, Max
int min = IntStream.range(1,5).min().getAsInt(); // 1 int max = IntStream.range(1,5).max().getAsInt(); // 4
-
reduce
Stream<Integer> stream = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)).stream(); System.out.println(stream.reduce((x, y) -> x+y).get()); // 15 (1+2=3, 3+3=6, 6+4=10, 10+5=15)
-
forEach
IntStream.range(1,10).filter(n->n==5).forEach(System.out::println); // 5 // .forEach( n -> System.out.println(n + ","); // 이런식으로 출력 형태도 만들어 줄 수 있음.
*스트림은 최종연산을 만나면 최종연산 후 더 이상 스트림유지를 할 수 없음.
마지막 수정일시: 2022-05-30 14:32
댓글남기기