Java Math.toIntExact内部lambda表达式?
我正在学习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
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));
}