티스토리 뷰

JAVA

Modern Java - Lambda, Stream

˙ᵕ˙ 2020. 10. 22. 16:08

Lambda표현식

  1. 개요 및 특징

    • 익명 inner클래스의 표현

    • 함수를 간결하게 표현한 방법

    • 함수나 메소드를 정의하지 않고 한 줄로 표현

    • 람다 표현식을 적용할 수 있는 인터페이스는 추상 메소드가 1개인 인터페이스만 가능(추상메소드가 1개인 인터페이스를 modern자바(8버전 이후)에서는 함수형 인터페이스라 한다.)

  2. 사용방법

    • (매개변수1, 매개변수2, ... ) -> {실행명령문}

    • 매개변수가 1이거나 실행명령문이 1줄이면 ()나 {}는 생략가능

  • 익명 inner 클래스 사용

package bigdata.modernjava.test;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JButtonTest {
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setLayout(new FlowLayout());
		JButton btnOk = new JButton("확인");
		JButton btnCancel = new JButton("취소");
		f.add(btnOk);
		f.add(btnCancel);
		f.setSize(300,200);
		f.setVisible(true);
		
		// 익명 inner 클래스를 정의해서 이벤트 처리
		// ActionListener는 인터페이스로 직접 new로 생성하지 못한다.
		// 의미는 이름이 없는 ActionListeneer의 하위클래스 정의하고 바로 생성해서
		// 사용 - 재사용이 불가능
		btnOk.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("확인");
			}
		});
		
		btnCancel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("취소");
			}
		});
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}
  • 실행

  • 람다식 사용

package bigdata.modernjava.test;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JButtonLambdaTest {
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setLayout(new FlowLayout());
		JButton btnOk = new JButton("확인");
		JButton btnCancel = new JButton("취소");
		f.add(btnOk);
		f.add(btnCancel);
		f.setSize(300,200);
		f.setVisible(true);
		// 1단계 - 어차피 ActionListener타입이므로 new ActionListener를 지운다.
		// 2단계 - ActionListener메소드는 actionPerformed하나 이므로 지운다.
		// 3단계 - 매개변수의 타입이 ActionEvent타입이므로 지운다.
		// 4단계 - 람다표현식의 기호인 -> 를 정의하고 매개변수가 하나이므로 ()괄호를 지운다.
		// 5단계 - 명령문이 한 줄이라면 {}를 지울 수 있다.
		btnOk.addActionListener(e -> System.out.println("확인"));
		btnCancel.addActionListener(e -> System.out.println("취소"));

		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
}
  • 실행

Stream

  • 컬렉션 빌더

  • 병렬처리를 위한 작업

  • 람다를 활용

  • Array, List, Map, Set등을 스트림으로 변환할 수 있다.

  • Stream을 List등으로 변환할 수 있다.

  • 여러 데이터를 이용해서 Stream을 생성하고 지원되는 다양한 메소드를 적용할 수 있는데 원하는 작업을 바로 처리하지 않고 결과를 요청하면 바로 처리한다.

  1. 메소드의 종류

    • 두 가지 유형의 메소드를 지원

      • Intermediate operation메소드(중간연산) : 중간단계에 해당하는 메소드

        이 메소드는 Stream을 리턴하기 때문에 method chaining을 통해 어떤 작업을 처리할지 스트림에게 지시할 수 있다.

        리턴 타입이 Stream인 메소드

        ex) map , filter , limit, distinct, sorted, ...

      • Terminal operation메소드(최종연산) : 작업을 끝내는 메소드

        ex) collect, forEach, count

package bigdata.modernjava.test;

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

public class Java8Concept {
	public static void main(String[] args) {
		// 1:2:3:...:10 을 출력
		
		// 1. 클래식 자바
		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		StringBuffer sb = new StringBuffer();
		int size = numbers.size();
		for(int i=0; i<size; i++) {
			sb.append(numbers.get(i));
			if(i!=size-1) {
				sb.append(":");
			}
		}
		System.out.println(sb);
		
		// 2. modern자바 (stream과 lambda)
		// => 모던자바를 적용하게 되면 주로 사용하는 것이 lambda와 stream이다.
		// => 코드가 읽기 편하고 병렬프로그램을 하기가 쉬워진다.
		String result = numbers.stream() //스트림으로 변환
						.map(String::valueOf) //하나의 타입을 다른 타입으로 매핑한다는 의미
											//numbers에 저장된 값이 Integer이다.
											//이 int값을 :과 연결해야 하므로 String으로 
											//처리하기 위해서 String result에 저장
											//타입이 다르면 stream내부에서 오류가 발생하므로
											//String클래스의 valueOf메소드를 호출해서
											//값을 String으로 변환하겠다는 의미
						.collect(Collectors.joining(":")); //map메소드를 적용하여
											//만들어진 결과에 ":"을 조인하여 작업하라는 의미
		System.out.println(result);
	}
}
  • 실행

stream 예제

  • static import

< StreamTest01.java >

package stream;

import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;

import java.util.List;
import java.util.Set;
import java.util.stream.Stream;

public class StreamTest01 {
	public static void main(String[] args) {
		List<String> list = Stream.of(1,3,3,5,5)
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.collect(toList());
		System.out.println(list);
		
		Set<String> set = Stream.of(1,3,3,5,5) // set:중복없음
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.collect(toSet());
		System.out.println(set);
		
		String result = Stream.of(1,3,3,5,5)
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.collect(joining());
		System.out.println("String=>" + result);
		
		String result2 = Stream.of(1,3,3,5,5)
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.collect(joining(" , "));
		System.out.println("String=>" + result2);
		
		String result3 = Stream.of(1,3,3,5,5)
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.distinct() //중복제거
				.collect(joining());
		System.out.println("String=>" + result3);
		
		List<String> list2 = Stream.of(1,3,3,5,5)
				.filter(i -> i>2)	// 필터를 적용 i가 2보다 큰 값 고르기
				.map(i -> i*2)	// 변환
				.map(i -> i+"")	
				.distinct()
				.collect(toList());
		System.out.println(list2);
	}
}
  • 결과

 

< StreamTest02.java >

package stream;

import java.util.Optional;
import java.util.stream.Stream;

public class StreamTest02 {
	public static void main(String[] args) {
		Optional<Integer> result = Stream.of(1,2,3,4,128)
				.filter(i->i==128)
				.findFirst();
		
		System.out.println(result);
		System.out.println(Stream.of(1,2,3,4,128)
				.filter(i->i==128)
				.findFirst());
		System.out.println(Stream.of(1,2,3,4,128)
				.filter(i-> i>=4)
				.count());
		
		Stream.of(1,2,3,4,5).forEach(i->System.out.println(i+" "));
	}
}
  • 결과

'JAVA' 카테고리의 다른 글

Pattern (정규표현식)  (0) 2020.10.07
JAVA 설치 및 환경변수 설정  (0) 2020.05.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함