programing

C#의 '수익률' 키워드에 해당하는 Java가 있습니까?

bestcode 2022. 9. 3. 13:22
반응형

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 총 aCollectorcollect(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이치

세 , 또 다른.yield2.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

반응형