How to fix java lambda filter(missing return statement) with future

Viewed 4036

How to solve java lambda filter future collection?

I got a future collection, And I want to filter out the false result returned in the collection, but using lambda to report (Missing return statement), I want to get a collection looks like List<Map<String, Object>>. What should I do to achieve filtering?

List<Future<Map<String, Object>>> future = 
    childIds.getChildOrder()
            .stream()
            .map(i -> service.submit(new some(i)))
            .collect(Collectors.toList());

            future.stream().filter(i -> {
                try {
                    i.get().get("success").equals(Boolean.FALSE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }).findAny().get().get();

enter image description here

The Map<String, Object> structure looks like this {"success":"false", "msg":"I got error"}

2 Answers

You must have return statements in all execution paths:

future.stream().filter(i -> {
    try {
        return i.get().get("success").equals(Boolean.FALSE);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return false; // depending on what you wish to return in case of exception
}).findAny().get().get();

You can do this in one go and create the list with what you need.

Include the return value to eliminate the IDE warning.

List<Future<Map<String, Object>>> future =
        childIds.getChildOrder()
                .stream()
                .map(i -> service.submit(new Some(i)))
                .filter(i -> {
                    try {
                        return Boolean.FALSE.equals(i.get().get("success"));
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace(); //try to use a logger instead
                    }
                    return false;
                })
                .collect(Collectors.toList());

I'd really take a look at what you're trying to do here though. There's likely a simpler way.

Related