在这种情况下如何使用java8 stream filter()方法?

在这种情况下如何使用java8 stream filter()方法?,java,java-8,java-stream,Java,Java 8,Java Stream,我想知道在这种情况下如何选择使用流过滤器。也就是说,我是否可以使用fiter取决于一个变量 我的原始代码是: if (keyword == null) { return list.parallelStream() //not using filter .map(...) .collect(Collectors.toList()); } return list.parallelStream()

我想知道在这种情况下如何选择使用流过滤器。也就是说,我是否可以使用fiter取决于一个变量

我的原始代码是:

if (keyword == null) {
        return list.parallelStream()
            //not using filter
            .map(...)
            .collect(Collectors.toList());
    }
    return list.parallelStream()
            .filter(dto -> dto.getString().contains(keyword))
            .map(...)
            .collect(Collectors.toList());
那么我可以把两个return语句混合在一起吗?像

return list.parallelStream()
            .filterIfKeywordNonNull(dto -> dto.getString().contains(keyword))
            .map(...)
            .collect(Collectors.toList());
先谢谢你

.filter(getFilter(dto));

您可以简单地将关键字test添加到过滤器中。像

return list.parallelStream()
        .filter(dto -> keyword == null || dto.getString().contains(keyword))
        .map(...)
        .collect(Collectors.toList());
为了提高效率,还可以一次构建流,并使用三元函数将其保存为临时变量。像

Stream<T> stream = (keyword == null) ? list.parallelStream() :
    list.parallelStream().filter(dto -> dto.getString().contains(keyword));
return stream.map(...).collect(Collectors.toList());

您可以在返回中使用三元组,但随后必须重复map和collect调用。

因为filter不是结束流条件。你可以随时添加它。那么,这个怎么样

public class ConditionalStreams {

//send your stream, a boolean, and the filter condition
public static Stream<Integer> filterFun(Stream<Integer> stream, boolean needToFilter, Predicate<Integer> filterStream){
        if(needToFilter)
            return stream.filter(filterStream);
        else
            return stream;
    }

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);

    // create your filter condition
    Predicate<Integer> filterStream = (num)->num%2==0;

    System.out.println("without filter: ");
    //call the function, pass parameters and return the right stream and process it.
    filterFun(numbers.parallelStream(),false,filterStream)
    .forEach(System.out::println);

    System.out.println("with filter : ");
    filterFun(numbers.parallelStream(),true,filterStream)
    .forEach(System.out::println);
    }
 }

可以编写自己的公共布尔validateString str{if关键字==null{return true;}else{return str.getString.containskeyword;}}方法。并在内部使用它。fileterdto->validatedto.@tonyhoan或只是公共布尔validateString str{return keyword==null | | | str.getString.containskeyword;}@Holger可以使用您的短方法,但我还是更喜欢我的方法,因为它更清晰、更可读性更强、更易于调试:所以用户没有原始的java sugar?不是最有效的,但可能是最干净的方法。或者您可以这样做。filterkeyword==null?dto->true:dto->dto.getString.Containskyword@shmosel这样做会有什么好处?@JoseDaSilva它只会计算关键字==null一次。您不需要使用“返回中的三元”重复映射和收集;可以使用大括号:return关键字==null?list.parallelStream:list.parallelStream.filterdo->dto.getString.containskeyword.map。托利斯特;但是您可以考虑使用避免重复列表的变体。ifkeyword!=null stream=stream.filterdto->dto.getString.containskeyword;返回流。映射。托利斯特;
public class ConditionalStreams {

//send your stream, a boolean, and the filter condition
public static Stream<Integer> filterFun(Stream<Integer> stream, boolean needToFilter, Predicate<Integer> filterStream){
        if(needToFilter)
            return stream.filter(filterStream);
        else
            return stream;
    }

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);

    // create your filter condition
    Predicate<Integer> filterStream = (num)->num%2==0;

    System.out.println("without filter: ");
    //call the function, pass parameters and return the right stream and process it.
    filterFun(numbers.parallelStream(),false,filterStream)
    .forEach(System.out::println);

    System.out.println("with filter : ");
    filterFun(numbers.parallelStream(),true,filterStream)
    .forEach(System.out::println);
    }
 }