본문 바로가기
Programming/Java, Spring

[Java 기초문법] Streams API | Streams, stream의 다양한 메소드, sum, sort, filter

by Renechoi 2022. 10. 20.

[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy

 


 

Streams

 

 

이와 같은 텍스트를 가져올 때 streams of strings으로 가져오는 것을 보자.

 

 

forEach => Consumer라고 하는 functional interface를 입력하도록 요구 

peopleText.lines()
        .forEach(System.out::println);

 

하나씩 가져오는 것을 볼 수 있다. 

 

 

 

what's happening here is that this line's method is returning a stream of strings, which are the individual line, each string is being fed into the next node, which is here dot + forEach.

 

 

what's new here is the way that we're referencing this method, rather than typing out this method, we are alowing the input to be implied using this new syntax, which is called a METHOD REFERENCE, because it refers an existing method. 

 

So It should take the individual strings one at a time from this streams of strings and pass them one at a time into a call to the print line method. 

 

 

Lambda expression would like this as a short version.

 

 

and the full version. 

 

 

 

and this is quite equivalent to this. 

 

void printStuff(String s){
    System.out.println(s);
}

 

 

here we can use map method, and what it does is it takes one input and it returns one output and the functional interface that is capable of doing exactly that => function. 

 

takes one input

of any generic type

and returns one output 

of some other type

 

 

 

 

 

 

map에서 s를 받고 createEmployees로 건네줌으로써 IEmployee 인터페이스의 return값이 return되고 그것을 foreach로 하나씩 출력하는 구조가 된다. 

 

and also here map inputs can simplified as method reference

 

 

 

 

 

 


 

 

Stream 작동 원리 

 

현재 코드에서 stream 명령으로 돌아간 로직 

 

 

 

 


 

 

 

다른 방법으로 stream을 사용하기 

 

 

아래와 같은 리스트가 있다고 치자. 

 

 

 

간단한 스트림 생성 코드 

 

 

 

간단하게 modify하는 방식은 map을 사용하는 것으로 동일하다. 

 

 

 

Set으로 바꾸고 hashcode를 hexidecimal로 출력해보는 방법 

 

300d26
693a59e
1ae66
1c24c

 

 

stream 자체를 호출해서 collections처럼 사용할 수 있다. 

 

 

Make so called stream of cars. 

 

 

record Car(String make, String model){}

Stream.of(new Car("Ford", "Bronco"), new Car("Tesla", "X"), new Car("Tesla", "3"))
    .forEach(System.out::println);

Car[make=Ford, model=Bronco]
Car[make=Tesla, model=X]
Car[make=Tesla, model=3]

 

 

filter를 적용해서 원하는 것만 가져오기 

 

 

 

 

Null 값을 제거하고 출력하는 방법 

String myVar = null;
Stream.ofNullable(myVar)
        .forEach(System.out::println);

 

returns nothing 

 

 

Instream으로 연속하는 숫자를 출력하기 

 

 

 

외부의 file에서 data를 stream으로 읽어오기 

 

 


try{
Files.lines(Path.of("com/neutrio/employees/Employees.txt"))
        .forEach(System.out::println);
        
} catch (IOException e){
    e.printStackTrace();
}

 

 

 


 

Summing with Streams 

 

 

여기서 일어나는 로직은 Iemployee라는 인터페이스의 리턴값을 받아서 온다는 것 

 

 

값을 sum하기 위해 mapToInt로 바꿔준다. 

 

 

.mapToInt(IEmployee::getSalary)

 

sum을 구하면 개별적으로 출력할 필요가 없으므로 

 

int sum = peopleText
        .lines()
        .map(Employee::createEmployee)
        .mapToInt(IEmployee::getSalary)
        .sum();

System.out.println(sum);

 

 

현황도 보면서 sum도 하는 간단한 방법은 메소드를 따로 추가해서 리턴값을 받아주는 것 

 

 

 

 


Sorting

 

 

간단한 sorting 함수 

.sorted((x,y) -> Integer.compare(x.getSalary(), y.getSalary()))

 

salary기준으로 sorting한다. 

 

 

다양한 기준으로 sorting하기 

 

 

 

 


 

Filter 

 

간단한 filter 함수 

 

.filter(e -> e.getSalary()> 5000)

 

 

 

반응형