- 자바는 객체지향 프로그래밍(OOP: Object Oriented Programming)
: 기능을 수행하기 위해서는 객체를 만들고,
객체 내부에 멤버 변수를 선언하고 기능을 구현
(매개변수)->{실행문;}
int add(int x, int y) {
return x + y;
}
(int x, int y) -> {return x+y;}
str->{System.out.println(str);}
public interface Add {
int add(int x, int y);
}
public class AddTest {
public static void(String[] args) {
Add addl = (x, y) -> x+y;
System.out.println(addl.add(2, 3));
}
}
@FunctionalInterface
어노테이션 사용하기@FunctionalInterface public interface MyNumber { int getMax(int x, int y); }
- 람다식의 구현과 호출
public class MyNumberTest { public static void main(String[] args) { MyNumber myNumber = (x, y) -> (x >= y)? x : y; //x와 y중 더 큰 수를 반환해주는 람다식을 인터페이스 자료형 System.out.println(myNumber.getMax(10,20)); } }
두 문자열을 매개변수로 받는 StringConcat 인터페이스를 각각의 방식으로 구현해보자.
public interface StringConcat {
public void makeString(String s1, String s2);
}
STEP 1. 인터페이스의 메서드를 구현하는 클래스를 만든다.
public class StringConcatTmpl implements StringConcat { @Override public void makeString(String s1, String s2) { System.out.println(s1 + s2); } }
STEP 2. 클래스의 객체를 main에 생성하고,
객체명.메서드()
로 함수를 호출한다.public class StringConcatTest { public static void main(String[] args) { StringConCatTmpl strTmpl = new StringConcatTmpl(); strTmpl.makeString("Hello", "World"); } }
public class StringConcatTest { public static void main(String[] args) { String s1 = "Hello"; String s2 = "World"; StringConcat concat = (s, v)->System.out.println(s+v); concat.newString(s1, s2); } }
- 람다식은 내부 익명 클래스가 자동적으로 생성되어 만들어진다. 따라서 프로그래머는 클래스를 따로 구현할 필요 없다.
- 정수 배열 받아 합과 갯수 출력하기
public class IntArrayStreamTest { public static void main(String[] args) { int[] arr= {1, 2, 3, 4, 5}; int sumVal = Arrays.stream(arr).sum(); long count = Arrays.stream(arr).count(); System.out.println(sumVal); System.out.println(count); } }
- 문자열 리스트에서 문자열의 길이가 5 이상인 요소만 출력하기
sList.stream().filter(s->s.length()>=5).forEach(s->System.out.println(s));
- 고객 클래스 배열에서 고객 이름만 가져오기
customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class ArrayListStreamTest {
public static void main(String[] args) {
//List는 추상 클래스, ArrayList가 concrete 클래스
List<String> sList = new ArrayList<String>();
sList.add("Thomas");
sList.add("Edward");
sList.add("Jack");
Stream<String> stream = sList.stream();
stream.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"));
sList.stream().filter(s->s.length()>=5).forEach(s->System.out.println(s));
}
}
stream() 메서드
를 다시 호출해야함.package ch01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class IntArrayStreamTest {
public static void main(String[] args) {
int[] arr= {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(n->System.out.print(n+"\t"));
System.out.println();
int sum = Arrays.stream(arr).sum();
System.out.println("sum : "+sum);
List<Integer> list = new ArrayList<Integer>();
list.add(1); list.add(2); list.add(3);
list.add(4); list.add(5); list.add(6);
int sum2= list.stream().mapToInt(n->n.intValue()).sum();
System.out.println(sum2);
}
}