안녕하세요 여러분. 대회를 계기로 여기에 기사가 아닌 짧은 교훈을 쓰기로 결정했습니다. Java의 람다와 스트림에 관한 것입니다. 이미 익숙하고 이를 사용하고 있다면 기사 끝 부분으로 바로 건너뛰어 연습할 수 있는 JavaRush 관련 작업 몇 가지를 선택해 보세요. Java 8 이상이 필요하고 JR의 교육이 필요합니다. 세부 사항은 거의 없고 이해할 수 없는 것들이 많을 것이며 그것을 알아내려는 강한 열망이 있을 것입니다. 람다와 스트림 출현의 역사를 설명하지 않을 것이라는 사실부터 시작하겠습니다. 나 자신도 모릅니다. 나는 그것이 함수형 프로그래밍 스타일에서 OOP 스타일로 발전했다는 것만 알고 있습니다. 짧은 학습 경험에서 나는 어떤 사람들이 아이디어를 이해하기 어렵다고 생각하는 방법과 내용을 간단히 보여 주었으므로 작성 방법만 기억하면 나중에 이해할 수 있습니다.
이제 자바 스트림으로 넘어가겠습니다. 이것은 독자 여러분이 생각했던 스트림이 아닙니다. 아니요,
람다
람다가 무엇인지 전혀 모른다면: 람다는 다음과 같습니다:(a, b) -> a.compareTo(b)
(переменные) -> действие
지금은 그것으로 충분합니다. 여기에서 이론을 읽을 수 있습니다. 링크 1 , 링크 2. 하지만 연습이 훨씬 더 재미있다고 생각합니다. 다음 문제를 해결해 보시기 바랍니다. 방법 1을 사용하여 계산기를 작성하세요. 이 메소드는 2개의 디지털 값과 다른 것을 받아들여야 합니다. 코드는 다음과 같습니다.
class Lambda{
public static void main (String[] args) {
}
public static double calculate(){
return null;
}
}
메소드 서명에 3개의 매개변수를 입력하고 calculate
, 1개의 명령을 추가하고 return
, 에서 이 메소드 호출을 테스트 해야 합니다 main
. 이 방법은 무엇을 할 수 있어야 합니까?
- 겹;
- 곱하다;
- 나누다;
- 덜다;
- 근을 계산하다;
- 세력을 키우다;
- 인수의 합을 첫 번째 숫자 + 117로 나눈 값을 거듭제곱합니다.
- 그리고 당신이 생각할 수 있는 다른 모든 작업.
if-else
;char
작동 표시기로서;switch-case
;- 그리고 당신의 마음에 떠오르는 다른 모든 것.
- 람다만이 작업을 수행합니다.
inputStream
그렇지도 않습니다 OutputStream
. 달라서 더 흥미롭습니다. 스트림은 완전히는 아니지만 여전히 주기를 대체했습니다. 그들은 "어떻게 하는지 설명하지 말고, 무엇을 해야 하는지 설명하라"는 모토로 제공됩니다. 스트림의 작은 예:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
여기서 무슨 일이 일어나고 있는 걸까요? 의견을 추가해 보겠습니다.
myList.stream() // получить поток
.filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
.map(String::toUpperCase) // преобразовать все значения, перевести в верхний регистр
.sorted() // отсортировать по порядку (дефолтный порядо)
.forEach(System.out::println); // вывести каждый элемент на экран
일반 루프와 비교해 보세요:
List<String> toSort = new ArrayList<>();
for(String s : myList){
if(s.startsWith("c")){
toSort.add(s.toUpperCase());
}
}
Collections.sort(toSort);
for(String s : toSort){
System.ouy.println(s);
}
코드를 읽어보면 모든 것이 무섭게 보이지만 주석을 사용하면 좀 더 쉬워지나요? 이것은 정상이며 나도 오랫동안 이해하지 못했습니다. 이해의 핵심은 실천입니다. 따라서 우리는 타사 기사를 읽고 질문에 대한 답변을 찾기 시작합니다. 여기 댓글에서 질문할 수도 있습니다. 완전한 답변을 제공하지는 않지만 방향을 지적하겠습니다. 스트리밍 연습에 유용하다고 생각되는 JavaRush의 작업 목록은 다음과 같습니다.
-
2208 - 1개의 스트림과 1개의 리턴으로 해결될 수 있습니다. 즉, 메소드의 본문은
return
1개의 전체 스트림으로 시작됩니다. 요구 사항을 생략합시다StringBuilder
. -
1908 - 1개의 스트림과 1개의 리턴으로 해결할 수도 있습니다. 파일을 읽는 것부터 시작합니다. 스트림을 통해 파일에 녹음하는 방법을 모르겠습니다(가능한 경우). 지금은 수동으로 녹음합니다. 저것들. 2개의 스트림(콘솔 및 파일 쓰기)만 엽니다. 시트나 스트림(google 및 javadoc)을 반환하는 메서드를 통해 파일을 읽습니다.
-
1907 - 이론적으로는 하나의 스트림으로 해결할 수도 있습니다. 스트림에 대한 입력은 파일 이름이고, 출력은 세계의 단어 수입니다.
-
1016 - 약간 왜곡된 방식으로 1개의 스트림과 1개의 리턴으로 해결할 수 있습니다.
-
1821 - 매우 쉽고 1개의 스트림과 1개의 리턴이 가능합니다.
이 두 가지 작업에서는 또 다른 스트리밍 방법과 또 다른 수집기를 소개합니다.
-
1925년 - 한 스트림에서 단어가 포함된 행을 가져온 다음 이를 파일에 쓸 수 있습니다(스트림에서 파일에 쓰는 것이 가능한지는 모르겠습니다).
GO TO FULL VERSION