在Java8中,如何应用此过滤器?

在Java8中,如何应用此过滤器?,java,functional-programming,java-8,Java,Functional Programming,Java 8,首先,我为问题的标题道歉,我想不出更好的表达方式,请让我知道我是否应该修正它 基本上,我是一个Java程序员,非常习惯命令式编程,发现(并使用)Java8的新特性 我写的方法很简单,我的工作很好,我只是想知道是否有一种更“实用”的方法来解决这个问题 基本上,我会收到一个用户列表,需要返回那些状态为无效的用户的百分比 以下是我到目前为止所做的: public static double getFailedPercentage(List<User> users){ Long fa

首先,我为问题的标题道歉,我想不出更好的表达方式,请让我知道我是否应该修正它

基本上,我是一个Java程序员,非常习惯命令式编程,发现(并使用)Java8的新特性

我写的方法很简单,我的工作很好,我只是想知道是否有一种更“实用”的方法来解决这个问题

基本上,我会收到一个
用户列表
,需要返回那些状态为
无效的用户的百分比

以下是我到目前为止所做的:

public static double getFailedPercentage(List<User> users){
    Long failedCount = users.stream().filter(user -> User.Status.INVALID.equals(user.getStatus())).collect(counting());
    return (failedCount * 100) / users.size();
}
公共静态双getFailedPercentage(列出用户){
Long failedCount=users.stream().filter(用户->用户.Status.INVALID.equals(用户.getStatus())).collect(计数());
返回(failedCount*100)/users.size();
}
如果可能的话,我想把它作为一行,我知道这可能是过度思考了,但我想知道我使用的语言的局限性和可能性


提前感谢您的时间。

以下几点应该可以

return users.stream()
            .mapToInt(user -> User.Status.INVALID.equals(user.getStatus()) ? 100 : 0)
            .average()
            .getAsDouble();
它将
状态映射为0或100,然后取平均值。这意味着对于每个
无效的
用户,您有一个100,对于其他用户,您有一个0,其平均值就是您要求的准确结果

100
等于您乘以的100。如果需要百分比的十进制表示,请将其替换为
1


您可以简单地去掉局部变量
failedCount
,然后就得到了一个一行程序。但是我想你想要一个直接返回百分比的流,对吗?它已经是一个1行程序了,你只是决定把它变成一个2行程序以便更具描述性。这是一件好事。@Thilo是的,我对这个解决方案很满意,我只是想看看我能走多远。出于学术目的,解释了如何使用collect来做类似的事情。这不是为了回答您的问题,而是为了寻找“语言的可能性”,您的第一行可以重新编写为:
long failedCount=users.stream().map(User::getStatus).filter(User.Status.INVALID::equals).count()我喜欢这个解决方案,我没有想到将状态映射到一个数字,这很酷。谢谢这是函数式编程中的一种正常方法吗?@RodrigoSasaki,特别是如果你想聚合,我会说是的。因为聚合函数通常是对数字进行操作的,所以您只需要为您的用例找到合适的映射。太好了,谢谢您的帮助!我会接受这个正确答案。