使用lambda表达式java从比较器返回值

使用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表达式,这样如果它是真的,它就会返

我正在java中模拟haskell函数
foldl
。 同时检索并删除列表的第一个索引
我已经用下面的签名
foldl(双函数f,rz,列表l)
,其中
T
字符串
R
a
int

现在唯一的问题是我需要创建一个
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)->
部分,现在我明白了应该怎么做,并且可能会继续做剩下的练习。再次谢谢你,没问题。我很高兴能帮上忙。