使用lambda表达式java从比较器返回值
我正在java中模拟haskell函数使用lambda表达式java从比较器返回值,java,haskell,lambda,comparator,Java,Haskell,Lambda,Comparator,我正在java中模拟haskell函数foldl。 同时检索并删除列表的第一个索引 我已经用下面的签名foldl(双函数f,rz,列表l),其中T是字符串和Raint 现在唯一的问题是我需要创建一个maxjava方法,该方法使用模拟的foldl,并具有以下签名:max(比较器c,列表l) 这是我正在使用的比较器作为示例: Comparator.comparing(s->Integer.valueOf(s.split(“,”[1]) 我想我需要构造一个lambda表达式,这样如果它是真的,它就会返
foldl
。
同时检索并删除列表的第一个索引我已经用下面的签名
foldl(双函数f,rz,列表l)
,其中T
是字符串和R
aint
现在唯一的问题是我需要创建一个max
java方法,该方法使用模拟的foldl
,并具有以下签名:max(比较器c,列表l)
这是我正在使用的比较器作为示例:
Comparator.comparing(s->Integer.valueOf(s.split(“,”[1])代码>
我想我需要构造一个lambda表达式,这样如果它是真的,它就会返回comparator的值
我所有的尝试都是徒劳的,因为我不知道如何在lambda表达式中使用比较器,我是这类表达式的新手
任何帮助都将不胜感激。
提前感谢。您可以使用比较器
通过以下操作获得最多两个元素
(t, u) -> c.compare(t, u) > 0 ? t : u
这表示:如果t
大于u
,则返回t
,否则返回u
这个lambda表达式可以作为foldl
方法中的BiFunction
传递。下面是一个完整的、有效的示例。我决定将列表的第一个元素作为z
传递。这是有道理的,因为空列表没有最大值
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 2, 8, 1, 9, 5);
System.out.println(max(Comparator.naturalOrder(), list));
}
// Not knowing Haskell at all, this is my guess at what foldl does.
private static <R, T> R foldl(BiFunction<R, T, R> f, R z, List<T> l) {
for (T t : l)
z = f.apply(z, t);
return z;
}
private static <T> T max(Comparator<T> c, List<T> l) {
if (l.isEmpty())
throw new IllegalArgumentException();
return foldl((t, u) -> c.compare(t, u) > 0 ? t : u, l.get(0), l);
}
publicstaticvoidmain(字符串[]args){
List=Arrays.asList(7,2,8,1,9,5);
System.out.println(max(Comparator.naturalOrder(),list));
}
//根本不了解哈斯克尔,这是我对福尔德尔的猜测。
私有静态R foldl(双函数f,rz,列表l){
对于(T:l)
z=f.apply(z,t);
返回z;
}
专用静态T最大值(比较器c,列表l){
if(l.isEmpty())
抛出新的IllegalArgumentException();
返回foldl((t,u)->c.compare(t,u)>0?t:u,l.get(0),l);
}
在Java8中,引入了流。这种过程在java中称为reduce,有一些标准方法可以用来做这类事情 通过执行以下操作,您可以使用比较器获得最多两个元素
(t, u) -> c.compare(t, u) > 0 ? t : u
这表示:如果t
大于u
,则返回t
,否则返回u
这个lambda表达式可以作为foldl
方法中的BiFunction
传递。下面是一个完整的、有效的示例。我决定将列表的第一个元素作为z
传递。这是有道理的,因为空列表没有最大值
public static void main(String[] args) {
List<Integer> list = Arrays.asList(7, 2, 8, 1, 9, 5);
System.out.println(max(Comparator.naturalOrder(), list));
}
// Not knowing Haskell at all, this is my guess at what foldl does.
private static <R, T> R foldl(BiFunction<R, T, R> f, R z, List<T> l) {
for (T t : l)
z = f.apply(z, t);
return z;
}
private static <T> T max(Comparator<T> c, List<T> l) {
if (l.isEmpty())
throw new IllegalArgumentException();
return foldl((t, u) -> c.compare(t, u) > 0 ? t : u, l.get(0), l);
}
publicstaticvoidmain(字符串[]args){
List=Arrays.asList(7,2,8,1,9,5);
System.out.println(max(Comparator.naturalOrder(),list));
}
//根本不了解哈斯克尔,这是我对福尔德尔的猜测。
私有静态R foldl(双函数f,rz,列表l){
对于(T:l)
z=f.apply(z,t);
返回z;
}
专用静态T最大值(比较器c,列表l){
if(l.isEmpty())
抛出新的IllegalArgumentException();
返回foldl((t,u)->c.compare(t,u)>0?t:u,l.get(0),l);
}
在Java8中,引入了流。这种过程在java中称为reduce,有一些标准方法可以用来做这类事情 我不清楚你想做什么。您能否解释一下foldl
的作用,并给出一些您的max
方法的输入和输出示例?此外,R
和T
类型绑定到什么,以及您打算如何保证s
是一个字符串。您所说的“使用模拟的foldl
是什么意思?”通过“获取一个比较器
和一个列表
”?@PaulBoddington我编辑了这个问题。提前谢谢。@ErickG.Hagstrom我编辑了这个问题,而且我不需要保证类型,这是一个练习,所以我们假设它是一个字符串。我不清楚你想做什么。您能否解释一下foldl
的作用,并给出一些您的max
方法的输入和输出示例?此外,R
和T
类型绑定到什么,以及您打算如何保证s
是一个字符串。您所说的“使用模拟的foldl
是什么意思?”通过“获取一个比较器
和一个列表
”?@PaulBoddington我编辑了这个问题。提前谢谢。@ErickG.Hagstrom我编辑了这个问题,而且我不需要保证类型,这是一个练习,所以我们假设它是一个字符串。提前感谢Hanks非常感谢Paul Boddington,foldl几乎就是它,唯一的区别是它删除了列表的第一个元素,但不需要编辑答案,解释它只是为了让你知道,我错过了我尝试的(t,u)->
部分,现在我明白了应该怎么做,并且可能会继续做剩下的练习。再次谢谢你,没问题。我很高兴能帮上忙。非常感谢Paul Boddington,foldl就是它,唯一的区别是它删除了列表中的第一个元素,但不需要编辑答案,解释它只是为了让你知道,我错过了我尝试的(t,u)->
部分,现在我明白了应该怎么做,并且可能会继续做剩下的练习。再次谢谢你,没问题。我很高兴能帮上忙。