1. Java 8의 혁신: 함수형 프로그래밍

Java 8이 출시되면서 이 언어는 함수형 프로그래밍 에 대한 강력한 지원을 얻었습니다 . 함수형 프로그래밍에 대한 오랫동안 기다려온 지원을 얻었다고 말할 수도 있습니다. 코드를 읽기가 더 어려웠지만 코딩은 더 빨라졌습니다 🙂

Java로 함수형 프로그래밍을 배우기 전에 다음 세 가지를 잘 이해하는 것이 좋습니다.

  1. OOP, 상속 및 인터페이스( Java Core 퀘스트의 레벨 1-2 ).
  2. 인터페이스의 기본 메소드 구현 .
  3. 내부익명 클래스 .

좋은 소식은 Java에서 함수형 프로그래밍의 많은 기능을 사용하기 위해 이 모든 것을 알 필요가 없다는 것입니다. 나쁜 소식은 익명의 내부 클래스에 대해 알지 못하면 모든 것이 어떻게 배열되고 어떻게 작동하는지 정확히 이해하기 어렵다는 것입니다.

다음 레슨에서는 작동 방식에 대한 깊은 이해 없이 Java의 기능적 프로그래밍 기능을 사용하는 것이 얼마나 쉽고 간단한지에 중점을 둘 것입니다.

Java에서 함수형 프로그래밍의 모든 뉘앙스를 이해하는 데 몇 달이 걸립니다. 몇 시간 안에 이러한 코드를 읽는 방법을 배울 수 있습니다. 따라서 작게 시작하는 것이 좋습니다. I/O 스트림이 있는 경우에도 마찬가지입니다.


2. I/O 스트림: 스트림 파이프라인

옛날 옛적에 I/O 스트림에 대해 배운 것을 기억하십니까: , InputStream, OutputStream등 ?ReaderWriter

와 같은 데이터 소스 에서 데이터를 읽는 스트림 클래스가 있었고 및 와 FileInputSteam같은 다른 스트림에서 데이터를 읽는 중간 데이터 스트림이 있었습니다 .InputStreamReaderBufferedReader

이러한 스트림은 데이터 처리 파이프라인으로 구성될 수 있습니다. 예를 들면 다음과 같습니다.

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

코드의 처음 몇 줄에서 Stream객체 체인을 구성하고 있다는 점에 유의하는 것이 중요합니다. 데이터가 아직 파이프라인을 통과하지 않았습니다.

그러나 메서드를 호출하는 즉시 buff.readLine()다음과 같은 일이 발생합니다.

  1. 개체 는 개체 의 메서드를 BufferedReader호출합니다.read()InputStreamReader
  2. 개체 는 개체 의 메서드를 InputStreamReader호출합니다.read()FileInputStream
  3. 개체 가 파일에서FileInputStream 데이터를 읽기 시작합니다.

즉, read()또는 같은 메서드 호출을 시작할 때까지 스트림 파이프라인을 따라 데이터가 이동하지 않습니다 readLine(). 스트림 파이프라인의 단순한 구성은 이를 통해 데이터를 구동하지 않습니다. 스트림 자체는 데이터를 저장하지 않습니다. 그들은 다른 사람들에게서만 읽습니다.

컬렉션 및 스트림

Java 8부터 컬렉션에서 데이터를 읽는 스트림을 가져올 수 있게 되었습니다(컬렉션뿐만 아니라). 그러나 이것은 가장 흥미로운 것이 아닙니다. 실제로 복잡한 데이터 스트림 체인을 쉽고 간단하게 구성하는 것이 가능해졌습니다. 그렇게 함으로써 이전에 5-10줄이 걸렸던 코드를 이제 1-2줄로 작성할 수 있습니다.

문자열 목록에서 가장 긴 문자열을 찾는 예:

가장 긴 문자열 찾기
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Stream인터페이스

스트림에 대한 Java 8의 확장된 지원은 인터페이스를 사용하여 구현됩니다 Stream<T>. 여기서 T는 스트림에서 전달되는 데이터 유형을 나타내는 유형 매개변수입니다. 즉, 스트림은 전달하는 데이터 유형과 완전히 독립적입니다.

컬렉션 에서 스트림 개체를 가져오려면 해당 메서드를 호출하기만 하면 됩니다 stream(). 코드는 대략 다음과 같습니다.

Stream<Type> name = collection.stream();
컬렉션에서 스트림 가져오기

이 경우 컬렉션은 스트림의 데이터 소스로 간주되며 Stream<Type>개체는 데이터 스트림의 형태로 컬렉션에서 데이터를 가져오는 도구가 됩니다.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

그건 그렇고, 컬렉션뿐만 아니라 배열 에서도 스트림을 얻을 수 있습니다 . 이렇게하려면 방법을 사용해야합니다 . 예를 들어:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
배열에서 스트림 가져오기

이 경우 어레이는 라는 스트림 의 데이터 소스로 간주됩니다 name.

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

개체가 생성될 때 데이터가 이동되지 않습니다 Stream<Type>. 우리는 단순히 스트림 파이프라인 구축을 시작하기 위해 스트림 개체를 얻었습니다.