Java Math.toIntExact内部lambda表达式?

Java Math.toIntExact内部lambda表达式?,java,lambda,Java,Lambda,我正在学习lambda表达式。 给定一个名称列表,我想计算以N开头的名称的数量 我做到了: final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static int countFriendsStartWithN() { return Math.toIntExact(friends .st

我正在学习lambda表达式。 给定一个名称列表,我想计算以
N
开头的名称的数量

我做到了:

final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott");

public static int countFriendsStartWithN() {
    return  Math.toIntExact(friends
            .stream()
            .filter(name -> name.startsWith("N"))
            .count());
}
final static List friends=Arrays.asList(“Brian”、“Nate”、“Neal”、“Raju”、“Sara”、“Scott”);
公共静态int countFriendsStartWithN(){
返回Math.toIntExact(朋友
.stream()
.filter(name->name.startsWith(“N”))
.count());
}
对count方法的调用返回一个原语
long
,但我想要一个
int

我使用
Math.toIntExact
long
值获取为
int


是否可以直接在lambda表达式中获取
int

否,无法将对
toIntExact
的调用放入方法调用链、流管道中。这是因为
count
是一个终端操作,返回一个原语
long
,不可能对其进行方法调用。终端操作是结束流管道并产生结果(或副作用)的操作


所以我相信你能做的最好的事情就是接受你已经拥有的代码。没关系。

在当前的lambda表达式中不能执行任何操作,因为这是一个谓词:它返回一个布尔值
Math.toIntExact
返回一个
int

您可以在不使用
Math.toIntExact
(或简单的强制转换)的情况下执行此操作,如下所示:


但是这可能比你现在正在做的事情要慢。

好吧,这里有一个有点愚蠢的方法,不使用强制转换就将计数计算为int:

public static int countFriendsStartWithN() {
    return friends.stream()
                  .filter(name -> name.startsWith("N"))
                  .mapToInt (s -> 1)
                  .sum();
}

这里有一种使用
reduce

public static int countFriendsStartWithN2() {
    return friends
            .stream()
            .filter(name -> name.startsWith("N"))
            .map(s -> 1)
            .reduce(0, Integer::sum);
}

另一个并非真正更好的选项是,可以使用应用修整器的收集器:

public static int countFriendsStartWithN() {
    return friends.stream()
                .filter(name -> name.startsWith("N"))
                .collect(Collectors.collectingAndThen(Collectors.counting(), Math::toIntExact));
}

如果您经常需要它,这可能有一个优势-您可以构建一个实用方法返回此
收集器
,以使其可重用。

lambda expersion是什么意思?在我看来,这没什么。如果你知道long值不是太大,你可以简单地将它转换为
int
@Eran,你知道它不是太大,因为它不一定大于集合中的项数,这是一个
int
。我只想知道是否有可能在流进程中进行int转换。
public static int countFriendsStartWithN() {
    return friends.stream()
                .filter(name -> name.startsWith("N"))
                .collect(Collectors.collectingAndThen(Collectors.counting(), Math::toIntExact));
}