我正在将一些代码移动到java8,试图(有时强迫自己)使用流和lambdas,但我对它们还不舒服。
我在类中有一些验证业务对象的方法。每个方法看起来都像
Optional<Fail> validate1(BusinessObject bo)
Fail是以某种方式描述错误的枚举,如果没有错误,则方法返回Optional.empty()。我不需要收集所有错误,但返回第一个错误,而无需执行以下验证。
我现在做的是
//first convert methods to suppliers
Supplier<Optional<Fail>> validate1= () -> validate1(bo);
Supplier<Optional<Fail>> validate2= () -> validate2(bo);
Supplier<Optional<Fail>> validate3= () -> validate3(bo);
//then some stream magic
return Stream.of(validate1, validate2, validate3)
.map(Supplier::get)
.filter(f -> f.isPresent())
.findFirst()
.orElse(Optional.empty()); //without the orElse, no error would return
// Optional(Optional.empty())
// instead of Optional.empty()
它工作,它完成任务,它不执行不必要的方法,它清晰易读(如果可选,它会更清晰。orElse被命名为getOrElse,但这是我力所能及的)。我想知道的是,这是否是一种合理的方式来实现我想要的功能,这段代码是否会被认为是“好的风格”或“惯用的java8”,或者我是否误用了流或可选,或者遗漏了一些明显的东西。
返回第一个非空可选选项或空可选选项(如果它们都是空的)的想法看起来足够普遍,以至于认为有一种官方的方法可以做到这一点,我脑海中的某些东西正在大喊“单子!”,但我对哈斯克尔的无知几乎是完美,所以我不知道。
可选的
很像一个包含0或1个元素的Stream
。然而,它没有实现Stream
,也没有stream()
方法(就像集合一样)。
然而,转换可选并不难
public static <T> Function<Optional<? extends T>, Stream<T>> asStream() {
return op -> op.map(Stream::of).orElseGet(Stream::empty);
}
有了这个方法,你可以简单地使用平面地图:
Stream.of(validate1, validate2, validate3)
.map(Supplier::get)
.flatMap(asStream())
.findFirst();
我有一个1+5列的表,如下所示。 MemberID==>表示Member_ID 我想运行一个查询,其中我获得的结果是Member_ID,Value,其中的值是非空值,来自5个值列中的任何一个。 如何在TSQL中做到这一点?谢谢你,史密斯
作为 LINQ 查询的一部分,我有一系列列,其中只有一列将包含一个值,如何将该单个值分配给变量而不必执行类似操作 类似于这个问题,但用LINQ代替SQL。 不幸的是,用SQL处理数据库端的任何事情都不是一个选项。
我正在使用DefaultTableModel,如下所示: 现在我想在“Selected”列中仅使一个复选框可选。这怎么能做到。我也试过下面的方法,但它不起作用。
问题内容: 从这样的表中: 如何在和列之间选择第一个非null值,并将其放入自己的字段中,这样输出将是: 问题答案: 您基本上是在描述函数: https://www.postgresql.org/docs/9.6/static/functions- conditional.html 在您的情况下:
问题内容: 我有一个示例数据框显示如下。对于每一行,我想先检查c1,如果它不为null,则检查c2。通过这种方式,找到第一个非空列并将该值存储到列结果中。 我现在正在使用这种方式。但是我想知道是否有更好的方法。(列名没有任何模式,这只是示例) 当有很多列时,此方法看起来不好。 问题答案: 首先使用回填s,然后通过以下方式选择第一列: 要么: 性能 :