【问题标题】:using anyMatch and lambdas to validate a collection in java使用 anyMatch 和 lambdas 来验证 java 中的集合
【发布时间】:2017-06-02 01:52:54
【问题描述】:

我有一个名为isValidDataStreams 的方法,我正在检查我的DataStream 集合中的任何成员是否违反了我在isNotEmpty 中的检查。

public class MyClass {
    private Collection<DataStream> DataStreams;

    /* checking ManifestTemplate/DataStreams */
    public boolean isValidDataStreams()
    {
        if ( getDataStreams().isEmpty() )
            return false;

        for( DataStream dataStream : DataStreams )
        {
            if ( DataStream == null || 
                 !isNotEmpty(DataStream.getAlias() ) || 
                 !isNotEmpty(DataStream.getFilePath() ) ) {
                return false;
            }
        }
        return true;
    }
}

public class DataStream {
    private String alias;
    private String filePath;
}

我感觉这段代码看起来有点难看。是否可以使用 lambdas 并使这段代码看起来更好,类似于

List<String> test = Arrays.asList("a", "b", null, "c", "d");

        if (test == null) {
            return;
        }

        if (test.stream().anyMatch( x -> { System.out.println( x ); return x == null; } ) ) 
        {
            System.out.println( "dsaflasdk" );
        }

我尝试如下替换它。

public boolean isValidDataStreamsLambda()
    {
        if ( getDataStreams().isEmpty() )
            return false;

        if(dataStreams.stream().anyMatch( x -> {!isNotNullAndEmpty(x.getAlias() ) || 
            !isNotNullAndEmpty(x.getFilePath())} ))
        {
            return false;
        }
        return true;
    }

但它给了我以下错误

不能抛出布尔类型的异常;异常类型必须是 Throwable 的子类

【问题讨论】:

  • “但它给了我以下错误”你确定吗?该代码没有throw 语句,因此我怀疑您向我们展示的代码可能会产生该错误。
  • 另外,更改代码以用于更漂亮但没有时间/空间优势的东西,并没有让我觉得有用
  • 这里有一个想法:不要将DataStream 放入您的DataStreams 集合中,如果它不会通过您在迭代它时使用的条件。这样你就不需要在退出时应用任何逻辑了。
  • 主要问题是即使您的原始代码也无法编译。如果是这样,我们必须得出结论,新代码不可能出现编译器错误。但是,由于旧代码显然不是真正的代码,我们只能得出结论,帮助是不可能的。
  • 为什么不直接使用return DataStreams.stream().allMatch()?

标签: java collections lambda java-8


【解决方案1】:

检查存储在列表中的所有 DataStream 对象的值“别名”和“文件路径”是否正确设置的方法:

  public static boolean isValidDataStreamsLambda(List<DataStream> dataStreamList) {
     return dataStreamList.stream()
        .filter(d-> d != null && d.getAlias() != null && d.getFilePath() != null && !d.getAlias().isEmpty() && !d.getFilePath().isEmpty())
        .count() == dataStreamList.size();
  }

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2012-09-25
    相关资源
    最近更新 更多