Kshitij Dhakal
Kshitij Dhakal

Reputation: 844

How can I do this in java without using Either?

I have a function that returns String.

private String processQuery(String[] args){
    //code logic
}

Returned result can either be a answer (Your account detail is $account_detail.) or response (Sorry I cannot understand you?). Depending upon the result, code will do separate things. What I came up with is to user Either<String, String>.

private Either<String,String> processQuery(String[] args){
    //code logic
}

private void reply(String[] args){
    //code logic
    var either = processQuery(args);
    return either.fold((l){
       //returned result is answer

    },(r){
       //returned result is response

    });
}

If it returns left then it is answer, if it returns right it is response. But since there is not Either type in java so I tried passing AtomicBoolean around.

What is the better solution for this only using java stl?

Upvotes: 1

Views: 242

Answers (2)

Joakim Danielson
Joakim Danielson

Reputation: 52043

One solution is to make the method take two lambda functions that corresponds to a correct and an incorrect answer and then call only the appropriate one

private void processQuery(String[] args, Consumer<String> correct, Consumer<String> incorrect){
    if (args.length == 0) {
        incorrect.accept("Sorry I cannot understand you?");
        return;
    }

    correct.accept("Your account detail is $account_detail.");
}

which can be called like this

private void reply(String[] args){
    processQuery(args, (
        reply -> System.out.println("Success!, " + reply)
    ),
    (
        reply -> System.out.println("Fail, " + reply)
    )
    );
}

or create variables for the different functions

Consumer<String> badAnswer = reply -> System.out.println("Fail, " + reply);
Consumer<String> goodAnswer = reply -> System.out.println("Success!, " + reply);
private void reply(String[] args){
    processQuery(args, goodAnswer, badAnswer);
}

Upvotes: 1

riorio
riorio

Reputation: 6826

You can use Pair:

Pair<String, String> pair = Pair.with("Blah", "Blee");

See some example here

A better approach, if your responses actually represent some kind of an error, will be to throw an exception of some kind, and to keep the return value of String to represent a "good" flow.

Upvotes: 0

Related Questions