주어진 배열이나 리스트를 정렬된 상태로 출력하고자 할때 -->
Array.sort(arr);
for(:){
System.out.prinln();
}
을 통해서 출력할 수 있다. 이 코드도 간결하고 깔끔하지만, 이 코드는 원본을 변형시킨다는 단점을 가지고 있다.
Stream API를 적용시킨다면.
Stream<String> arr = arr2.stream();
arr.sorted().forEach(~~~); 라고 표현을 할 수있다.
즉 :: Stream API를 사용했을 경우
1. 일회성이다.
2. 원본 데이터를 변형시키지 않는다.
-->stream은 원본 데이터를 건들지 않는다.
3. 내부 반복으로 작업을 처리한다.
--> forEach(~~); 반복문이 함수 안에 숨겨져있다.
II 람다식
Stream연산은 매개변수로 함수형 인터페이스를 받도록 되어있다. 람다식은 반환값으로 함수형 인터페이스를 반환하기 때문에 둘의 상호작용이 기대가 되는 것이다.
// 기본 방식 예시
public String hello() {
return "Hello World!";
}
// 람다 방식
(매개변수, ...) -> { 실행문 ... }
// 예시
() -> "Hello World!";
람다식의 특징:
1. 람다식 내에서 사용되는 지역변수는 모두 상수로 처리가 된다.
2. 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.
---> 람다를 적절하게 활용할 경우 가독성이 좋아지고 코드를 간결하게 만들고 , 함수를 만드는 과정이 없어 병렬 프로그래밍이 용이하지만,
너무 많이 사용할 경우 코드가 지저분해지고, 재귀를 받지 않는다.
함수형 인터페이스
람다의 반환 타입은 함수형 인터페이스다.
여러개의 디폴트 메서드가 있더라도 , 추상 메서드가 오직 하나면 함수형 인터페이스라고 합니다.
Stream의 기본 문법.
생성 ---> 중간 연산 ----> 최종 연산
//생성
Stream<String> stream = Arrays.stream(new String[] {"a","b","c"});
IntStream stream = IntStream.range(4,10);
//rangeClosed(1,10); 10까지 포함
//중간연산
//filter
.filter(v->v==1)
if()// 와 비슷하다고 보면 된다.
//map은 데이터의 형태를 바꾸는 것. 새로운 스트림을 만들어 준다.
-->메서드 실행
.map(s->s.toUpperCase());
--->String이 모두 대문자요소들로 바뀌게된다.
예를들면 기본Stream에서 map을 통하여 int stream으로도 변환이 가능하다.
//sorted
-->말그래도 정렬하는 것이다.
Comparaotr.reversOrder();
역으로 정렬하는 것.
//Distinict
중복을 제거하는 것이다.
//peek
--->중간에 peek을 통하여 연산된 값을 확인하기 위해 사용된다.
//maptoObj , maptoint, --->스트림 변환
//최종
Max/Min/Sum/Average/CountPermalink
int stream이라면 사용가능하다.
collect를 통해서 list로 반환도 가능하다.
그밖에
Collectors.joining() //하나의 문자열에 추가해서 반환
Collectors.groupingBy() //동일한 요소로 묶기
Collectors.partitioningBy()// 특정 조건의 참/거짓으로 묶기
FlatMap --> 이중 배열이나 이중 리스트를 stream으로 한번에 받을 때 사용하는 것이다.
reduce(accumulator)
--> for문을 사용하여 int num에 지속적으로 더하는 효과를 주며
ex) .reduce(10,(a,b)->{
}) 라는 형식을 사용할 수 있다.
---> 병렬 스트림도 있지만 나중에 소개하도록 하겠슴당
쓰레드의 개념과 같이 사용하면 된다.
사용예시입니다.
public class Set {
static class Member {
String name;
String gender;
int age;
public Member(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public int getAge() {
return age;
}
}
public static void main(String[] args) {
int arr [] = new int[]{1,3,5,7,8,8};
String arr2[] = new String[]{"장태환","이지원","이승현","오경운","장태환"};
Arrays.stream(arr).filter(i->i%2==0).forEach(i-> System.out.print(i+" "));
System.out.println();
IntStream it = Arrays.stream(arr).filter(i -> i%2!=0);
it.forEach(name -> System.out.print(name+" "));
IntStream zz = IntStream.rangeClosed(1,10).distinct().peek(w->System.out.println(w)).limit(5).skip(2);
zz.forEach(name -> System.out.print(name+" "));
Stream<String> stream = Arrays.stream(arr2).distinct().map(String::toLowerCase);
stream.forEach(name -> System.out.print(name+" "));
IntStream zz = IntStream.rangeClosed(0,10).skip(5).limit(5);
zz.forEach(name -> System.out.print(name+" "));
int arr[][] = new int[][]{{1,2},{8,11},{4,44,123,412}};
Arrays.stream(arr).flatMapToInt(Arrays::stream).sorted().forEach(name -> System.out.println(name));
king k = ()-> System.out.println("Hell");
k.hello();
List<Integer> list = Arrays.asList(1,2,3,4);
List<Integer> hi =list.stream().mapToInt(Integer::intValue).filter(i->i%2==0).collect(Collectors.toList());
int arr[] = new int[]{1,2,3,4};
Arrays.stream(arr).max().orElse(0);
String str[]=new String[]{"길동이"};
Arrays.stream(str).mapToInt(String::length).max().getAsInt();
List<String> liOne = new ArrayList<>();
liOne.add("A");
liOne.add("B");
liOne.add("C");
List<String> liTwo = new ArrayList<>();
liTwo.add("D");
liTwo.add("E");
liTwo.add("F");
List<String> me = Stream.of(liOne,liTwo).flatMap(Collection::stream)
.collect(Collectors.toList());
String asw = "hello";
System.out.println( asw.startsWith("h"));;
HashMap<String,Integer> map = new HashMap<>();
String s[] = new String[]{"leo","king","kong"};
String w[] = new String[]{"leo","king"};
String answer =" ";
for(String zz:w ){
map.put(zz,1);
}
System.out.println(map);
for(String ww : s){
if(!map.containsKey(ww))
answer+=ww;
}
String phonebook[] = new String[]{"119 ,97674223 ,1195524421"};
Arrays.sort(phonebook);
System.out.println(phonebook[0]);
HashMap<Integer,String> map = new HashMap<>();
for (int i = 0; i < phonebook.length; i++) {
map.put(i,phonebook[i]);
}
for (int i = 0; i < phonebook.length-1; i++) {
for (int j = i+1; j < phonebook.length; j++) {
if(map.get(j).contains(map.get(i)))return false;
}
}
List<String> WORDS = Arrays.asList("Tony","a","hULK","B","america","X","nebula","Korea");
System.out.println(WORDS.stream().collect(Collectors.groupingBy(c->c.charAt(0),Collectors.counting())));
}
interface king{
void hello();
}
}