java8의 통과 행위 매개 변수화 전달 코드
비헤이비어 매개 변수
행위 매개 변수화는 우리가 빈번하게 변화하는 수요를 처리하는 데 도움을 줄 수 있는 소프트웨어 개발 모델이다. 통속적으로 말하면 코드 블록을 꺼내서 그것을 준비하고 실행하지 않는 것이다.이 코드 블록은 나중에 프로그램의 다른 부분에 호출될 수 있다. 이것은 우리가 이 코드의 집행을 늦출 수 있다는 것을 의미한다.
배경.
농장에 사과가 많으니 우리는 특정한 사과를 선별해서 기록해야 한다.다음으로, 우리는 끊임없이 변화하는 수요를 통해 우리의 코드를 재구성한다.아래의 장면은 모두 내가 가상해 낸 것이어서 이야기의 발전에 편리하다. 하하.
단편 1
처음에 다른 사람들이 우리에게 요구한 것은 모든 색깔이 녹색인 사과를 선별하는 것이다.나는 네가 나를 경멸하는 것이 아니냐고 생각했다. 이렇게 간단하니, 녹색 사과를 새 집합에 두루 두면 되지 않겠니?나는 프로그래머야. 잡일을 하러 온 게 아니라 강요하는 코드를 써야 돼.됐어, 그냥 써.코드는 다음과 같습니다.
public static List filterGreenApples(List inventory) {
List result = new ArrayList<>();
for (Apple apple : inventory) {
if ("green".equals(apple.getColor())) {
result.add(apple);
}
}
return result;
}
나는 코드를 제출한 후에 엉덩방아를 찧으며 다른 일을 했다. 마치 매우 큰 프로젝트를 완성한 것 같다...
부분 2
다음날, 그 사람은 또 나를 찾아와서 빨간색 사과를 선별하는 인터페이스를 실현할 수 있겠느냐고 말했다.나는 마음속으로 혼잣말을 했다. 침대칸. 이 수요의 변화가 그렇게 빨랐는데, 어제는 사과가 푸르고, 오늘은 빨개졌다. 니마, 이 극악무도한 상인, 촉매제는 대단하다.앞으로 사과를 먹을 때는 푸른 것을 먹어라.처음에 나는 위의 코드copy를 내린 다음에'green'을'red'로 바꾸려고 했지만 자세히 생각해 보니 만약에 내일 흑사과 인터페이스를 쓰라고 한다면 나는 또 하나를 쓰지 않을 것이다.그래서 color를 추상화하여 하나의 매개 변수로 가져와서 네가 원하는 색깔을 내가 다 가지게 되었다.갑자기 내가 대단하다는 걸 알게 됐어요. 추상적인 것도 할 줄 알아요...자기 도취 중.코드는 다음과 같습니다.
public static List filterApplesByColor(List inventory, String color) {
List result = new ArrayList<>();
for (Apple apple : inventory) {
if (color.equals(apple.getColor())) {
result.add(apple);
}
}
return result;
}
다 쓴 후에 나는 마음속으로 그 투덜거리는 극악무도한 자본주의에 대해 색깔을 추상화했다. 네가 어떻게 변화하는지 보자.형, 그런데--프로그래머.
세션 3
밤에 돌아가서 편히 자고 다음날 그 사람이 또 왔어요. 맞아요. 그 남자예요.나는 그에게 내가 쓴 인터페이스가 안 되는지 물었다.그 사람이 돌아왔어, 아니야, 이쪽에 또 새로운 수요가 생겼어.갑자기 온몸이 멍청해졌다.그리고 필요, 됐어, 누가 나보고 프로그래머래.이후 그는 나에게 새로운 수요는 큰 사과와 작은 사과를 구분하는 것이고 큰 사과는 무게가 500g보다 크다고 말했다.두말 없이 고개를 돌려 코드를 훑어보았다.코드는 다음과 같습니다.
public static List filterApplesByWeight(List inventory, int weight) {
List result = new ArrayList<>();
for (Apple apple : inventory) {
if (apple.getWeight() > weight) {
result.add(apple);
}
}
return result;
}
똑똑한 나는 수요가 바뀔 거라고 생각했는데 이번에는 직접 이 인터페이스를 추상화하여 마음속으로 은근히 기뻐했다.세상에 나 같은 프로그래머가 있다는 것을 생각하면 세상에 희망이 있다는 뜻이다.
단편 4
다음날 그가 또 왔다. 나는 또 일을 해야 한다는 것을 안다.새로운 수요는 빨간색에 무게가 500g 이상인 사과를 거르는 것이다.코드는 다음과 같습니다.
public static List filterApples(List inventory, String color, int weight) {
List result = new ArrayList<>();
for (Apple apple : inventory) {
if (color.equals(apple.getColor()) && apple.getWeight() > weight) {
result.add(apple);
}
}
return result;
}
얼마 지나지 않아 내가 설계를 다 했지만 이전의 즐거움이 없어졌다. 내일 또 무슨 새로운 수요가 있을지 아기의 마음이 매우 괴롭다.
단편 5
이후에 나를 놀라게 한 것은 새로운 수요가 제기되지 않았다는 것이다. 나는 은근히 기뻐하며 한 가지 문제를 생각하고 있었다.왜, 수요가 변하면, 나의 코드가 그렇게 크게 변해야 합니까?수요는 모두 애플을 선택하는 것과 관련이 있다. 어떤 애플을 선택할 때 파라미터를 통해 전달되는지 핑계를 대고 서로 다른 파라미터를 전달하는 방법이 없을까?디자인 모델에 익숙한 당신이라면 전략 모델을 생각해 낼 수 있을 것이다.인터페이스가 일치하여 필요에 따라 이 인터페이스에 대응하는 실례를 전달한다.인터페이스 프로그래밍을 위한 일종의 구현이기도 하다.먼저 애플 선택의 논리를 탑재할 인터페이스를 설계했는데 코드는 다음과 같다.
public interface ApplePredicate {
boolean test(Apple apple);
}
이제 우리는 서로 다른 실현으로 서로 다른 논리를 전달할 수 있다. 다음과 같다.
//
public class GreenApplePredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return apple.getColor().equals("green");
}
}
//
public class BigApplePredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return apple.getWeight() > 500;
}
}
//
public static List filterApples(List inventory, ApplePredicate p) {
List result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
이를 통해 알 수 있듯이 코드 주체는 앞으로 우리가 변하지 않을 것이다. 서로 다른 행위(필터 논리)를 전달하면 된다. 그리고 여기는 하나의 매개 변수만 전달하고 다양한 행위, 다양한 행위, 하나의 매개 변수를 전달할 수 있으니 매우 nice가 아니냐.나는 또 득의양양하게 뽐내기 시작했다.자신이 또 심해진 것 같아서 저녁에 돌아가서 제멋대로 잔다.
토막 6
다음날에도 새로운 수요가 없었다. 우리는 프로그래머가 할 일이 없으면 이 귀중한 자원을 헛되이 낭비하고 다른 사람이 아까워하지 않아도 나는 아까워한다.그래서 자기는 또 어제의 그 코드를 만지작거리러 갔다.처음에는 사용하기에 편했지만 오래 걸려서 매번 새로운 논리가 이 인터페이스를 실현해야 한다는 것을 발견했다. 너무 괴로웠다. 갑자기 자바에 익명 클래스가 있다는 생각이 들었다. 그래서 그 다음에 바로 익명 클래스로 이 논리를 실현했다.코드는 다음과 같습니다.
List greenApples = filterApples(inventory, new ApplePredicate() {
@Override
public boolean test(Apple apple) {
return apple.getColor().equals("green");
}
});
이렇게 보면 확실히 이전보다 훨씬 간결하다. 인터페이스를 현저하게 실현하지 마라.그러나 자세히 살펴보니 이 안에 진정으로 유용한 코드는 이 줄에 있다.
return apple.getColor().equals("green");
그렇다면 Filter Apples 방법에만 이런 진정한 논리적 코드만 전달하는 방법은 없을까?다행히 자바8은 행위 매개 변수화 지원을 제공합니다.그래, 지원했으니 뭘 더 기다려, 해, 다음 코드가 해결될 거야.
List greenApples = filterApples(inventory, (Apple apple) -> apple.getColor().equals("green"));
뭐야, 내가 잘못 본 거 아니지, 이렇게 신기해?잘못 보지 않았습니다. 전달된 매개 변수를 lambda 표현식이라고 합니다. 만약 간결하지 않다고 생각한다면 유형을 제거할 수 있습니다. 이렇게:
List greenApples = filterApples(inventory, apple -> apple.getColor().equals("green"));
상기 몇 단계를 거쳐 우리는 여러 차례의 코드를 재구성하여 인터페이스가 수요의 변화에 적응할 수 있도록 했다. 한편, 우리는 불필요한 코드를 작성하고 싶지 않다. lambda 표현식을 통해 핵심 코드를 전달하고 프로그래머가 불필요한 작업을 하지 않아서 정말 다행이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.