C#의 '수익률' 키워드에 해당하는 Java가 있습니까?
Java 자체에는 직접 동등한 것이 없다는 것을 알고 있습니다만, 혹시 서드파티가 아닐까요?
그것은 매우 편리합니다.현재 저는 트리 내의 모든 노드를 5줄 정도의 코드와 수율을 갖는 반복기를 구현하고 싶습니다.
제가 알고 있는 두 가지 옵션은 2007년 Aviad Ben Dov의 Infomancers-Collections 라이브러리와 2008년 Jim Blackler의 YieldAdapter 라이브러리입니다(다른 답변에서도 언급되어 있습니다).
다 '다 '로 를 쓸 수 .yield return
하므로 둘 다할 수 있습니다java constructure 。 사이에 에 띄는 은 다음과 같습니다
메카닉스
Aviad의 라이브러리는 바이트 코드 조작을 사용하는 반면 Jim의 라이브러리는 멀티스레딩을 사용합니다.필요에 따라 각각 장단점이 있을 수 있습니다.아마 Aviad의 솔루션이 더 빠른 반면, Jim의 솔루션은 더 휴대성이 뛰어납니다(예를 들어, Aviad의 라이브러리는 Android에서 작동하지 않을 것입니다).
인터페이스
Aviad 라이브러리는 보다 깔끔한 인터페이스를 갖추고 있습니다. 예를 들어 다음과 같습니다.
Iterable<Integer> it = new Yielder<Integer>() {
@Override protected void yieldNextCore() {
for (int i = 0; i < 10; i++) {
yieldReturn(i);
if (i == 5) yieldBreak();
}
}
};
것은 하지만, 을 필요로 .adept
총 aCollector
collect(ResultHandler)
메서드...그러나 Zoom Information에 의해 Jim의 코드에 다음과 같은 래퍼를 사용할 수 있습니다.이것에 의해, 다음과 같이 큰폭으로 심플화 됩니다.
Iterable<Integer> it = new Generator<Integer>() {
@Override protected void run() {
for (int i = 0; i < 10; i++) {
yield(i);
if (i == 5) return;
}
}
};
면허증.
Aviad의 솔루션은 BSD입니다.
Jim의 솔루션은 퍼블릭 도메인이며, 위에서 언급한 랩퍼도 마찬가지입니다.
Java에 Lambdas가 탑재되어 있기 때문에 이 두 가지 방법을 모두 보다 깔끔하게 만들 수 있습니다.뭐 이런 거 할 수 있어요
public Yielderable<Integer> oneToFive() {
return yield -> {
for (int i = 1; i < 10; i++) {
if (i == 6) yield.breaking();
yield.returning(i);
}
};
}
이 질문은 매우 오래된 질문이며 위에서 설명한 두 가지 방법이 있습니다.
- 바이트 코드 조작은 포팅 중에 그리 간단하지 않습니다.
- 베이스의 「」
yield
이치
세 , 또 다른.yield
2.0+가 C# 2.0+에 대해 의 yield return/break
세대: lombok-pg.이것은 완전히 국가 기계에 기반을 두고 있으며, 이 기구에 대한 긴밀한 협력이 필요합니다.javac
소스 코드 AST를 조작할 수 있습니다.유감스럽게도 롬복-pg 지원은 중단되어 있습니다(1~2년 이상 저장소 활동이 없습니다).원래 Project Lombok에는 유감스럽게도 다음과 같은 기능이 없습니다.yield
기능(단, 이클립스, 인텔리J IDEA 등의 IDE가 더 우수합니다).
여기서 다른 (MIT 라이선스)솔루션을 발행했습니다.이 솔루션은 별도의 스레드에서 생산자를 기동하고 생산자와 소비자 사이에 경계 큐를 설정하여 생산자와 소비자 간의 버퍼링, 흐름 제어 및 병렬 파이프라인링을 가능하게 합니다(생산자가 이전 항목을 소비하는 동안 소비자가 작업할 수 있도록 함).다음 아이템을 제작하고 있습니다.
다음 익명 내부 클래스 양식을 사용할 수 있습니다.
Iterable<T> iterable = new Producer<T>(queueSize) {
@Override
public void producer() {
produce(someT);
}
};
예를 들어 다음과 같습니다.
for (Integer item : new Producer<Integer>(/* queueSize = */ 5) {
@Override
public void producer() {
for (int i = 0; i < 20; i++) {
System.out.println("Producing " + i);
produce(i);
}
System.out.println("Producer exiting");
}
}) {
System.out.println(" Consuming " + item);
Thread.sleep(200);
}
또는 람다 표기법을 사용하여 보일러 플레이트를 줄일 수 있습니다.
for (Integer item : new Producer<Integer>(/* queueSize = */ 5, producer -> {
for (int i = 0; i < 20; i++) {
System.out.println("Producing " + i);
producer.produce(i);
}
System.out.println("Producer exiting");
})) {
System.out.println(" Consuming " + item);
Thread.sleep(200);
}
Stream.iterate(seed, seed Operator).제한(n)foreach(작용)는 수율 연산자와 동일하지 않지만 다음과 같은 방식으로 자체 생성자를 작성하는 것이 유용할 수 있습니다.
import java.util.stream.Stream;
public class Test01 {
private static void myFoo(int someVar){
//do some work
System.out.println(someVar);
}
private static void myFoo2(){
//do some work
System.out.println("some work");
}
public static void main(String[] args) {
Stream.iterate(1, x -> x + 1).limit(15).forEach(Test01::myFoo); //var1
Stream.iterate(1, x -> x + 1).limit(10).forEach(item -> myFoo2()); //var2
}
}
또, 프로젝트에 이미 RXJava를 사용하고 있는 경우는, Observatable을 「수익률」로서 사용하는 것을 추천합니다.자체 Observable을 만들면 비슷한 방식으로 사용할 수 있습니다.
public class Example extends Observable<String> {
public static void main(String[] args) {
new Example().blockingSubscribe(System.out::println); // "a", "b", "c", "d"
}
@Override
protected void subscribeActual(Observer<? super String> observer) {
observer.onNext("a"); // yield
observer.onNext("b"); // yield
observer.onNext("c"); // yield
observer.onNext("d"); // yield
observer.onComplete(); // finish
}
}
관측 가능은 반복기로 변환할 수 있으므로 기존 루프에 사용할 수도 있습니다.또한 RXJava는 매우 강력한 툴을 제공하지만, 단순한 툴만을 필요로 하는 경우에는 과잉이 될 수 있습니다.
// Java code for Stream.generate()
// to generate an infinite sequential
// unordered stream
import java.util.*;
import java.util.stream.Stream;
class GFG {
// Driver code
public static void main(String[] args) {
// using Stream.generate() method
// to generate 5 random Integer values
Stream.generate(new Random()::nextInt)
.limit(5).forEach(System.out::println);
}
}
여기서부터.
언급URL : https://stackoverflow.com/questions/1980953/is-there-a-java-equivalent-to-cs-yield-keyword
'programing' 카테고리의 다른 글
Java에서 날짜에 n시간을 추가하시겠습니까? (0) | 2022.09.03 |
---|---|
XOR의 역함수란 무엇입니까? (0) | 2022.09.03 |
라우터에 저장하기 위한 액세스 (0) | 2022.09.03 |
Android 개발용 라이브러리를 작성하려면 어떻게 해야 합니까? (0) | 2022.09.03 |
사용자 지정 지시문을 통해 v-model 속성 값을 수정하는 방법은 무엇입니까? (0) | 2022.09.03 |