Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有循环并且只使用foldLeft,我如何获得minVal?_Java_Oop_Lambda_Functional Programming - Fatal编程技术网

Java 如果没有循环并且只使用foldLeft,我如何获得minVal?

Java 如果没有循环并且只使用foldLeft,我如何获得minVal?,java,oop,lambda,functional-programming,Java,Oop,Lambda,Functional Programming,因此,我对函数式编程有了一点了解,但为此,我不能使用循环,而是必须使用我编写的foldLeft或foldRight函数来获得minVal static <U,V> V foldLeft(V e, Iterable<U>l, BiFunction<V,U,V> f){ for(U u:l) { e = f.apply(e, u); } return e; } static <U,V> V foldRight(V e, Iterable<

因此,我对函数式编程有了一点了解,但为此,我不能使用循环,而是必须使用我编写的foldLeft或foldRight函数来获得minVal

static <U,V> V foldLeft(V e, Iterable<U>l, BiFunction<V,U,V> f){
for(U u:l) {
    e = f.apply(e, u);
}
return e;
}

static <U,V> V foldRight(V e, Iterable<U>l, BiFunction<U,V,V> f){
   for(U u:l) {
      e = f.apply(u, e);
   }
return e;
static V foldLeft(ve、Iterablel、双功能f){
对于(U:l){
e=f。应用(e,u);
}
返回e;
}
静态V折叠灯(VE、Iterablel、双功能f){
对于(U:l){
e=f。应用(u,e);
}
返回e;
我现在要写一个minVal:

//(5) Use minVal to calculate the minimum of a List of 
//       Integers
static <U> U minVal(Iterable<U> l, Comparator<U> c){
// write using fold.  No other loops permitted. 
List<U> temp = new ArrayList<U>();
l.forEach(temp::add);
return temp.stream().min(c).get(); //Not sure if this actually works yet
}
/(5)使用minVal计算
//整数
静态U最小值(Iterable l,比较器c){
//使用折叠写入。不允许使用其他循环。
List temp=new ArrayList();
l、 forEach(temp::add);
return temp.stream().min(c.get();//不确定这是否有效
}
我曾试图编写并测试它,但我现在也被困在如何测试minVal上:

List<Integer> numList = new ArrayList<>();

    numList.add(5);
    numList.add(10);
    numList.add(15);
    numList.add(20);
    numList.add(22);
    numList.add(1);


    System.out.println(minVal(numList, 0)); //What would I place as the 
                                            //comparable argument 
List numList=new ArrayList();
增加(5);
增加(10);
增加(15);
增加(20);
numList.add(22);
numList.add(1);
System.out.println(minVal(numList,0));//我将把什么作为
//可比论据
当然,上面的内容给了我一个错误。我已经阅读了Lambda中的比较器,但不明白如何在测试(或print语句)中实现它

感谢您的帮助/解释!
请注意,如果我遗漏了任何信息,请告诉我,我会尽可能彻底。

您可以使用

foldLeft
将您的
minVal
定义为:

static <U> U minVal(Iterable<U> l, Comparator<U> c) {
    // write using fold.  No other loops permitted.
    return foldLeft(l.iterator().next(), l, (u, u2) -> c.compare(u, u2) < 0 ? u : u2);
    // check for l.iterator().hasNext() or else define the behaviour
}
静态最小值(可数l,比较器c){
//使用折叠写入。不允许使用其他循环。
返回foldLeft(l.iterator().next(),l,(u,u2)->c.compare(u,u2)<0?u:u2);
//检查l.iterator().hasNext()或定义行为
}

然后使用
比较器调用它谢谢!我可以通过添加“Integer::compare”来测试我的方法。然后你的foldLeft让我更了解这一点!我还有一个问题,如果我想得到最大值,我如何才能翻转它?@QWERTY更改三元运算符中的符号(即
(u,u2)->c.compare(u,u2)>0?u:u2
)应该足以得到最大值,而不是最小值。我得到了,但我想知道是否有一种方法可以计算出最小值和最大值,只需要一条线?下一个测试必须做的是
/(6)使用minVal计算整数列表中的最大值
。再次感谢您的帮助!@QWERTY哦,这样,您可以反转传递给
minVal
比较器
,例如
System.out.println(minVal(numList,Comparator.comparingit(x->x).reversed())
将使用现有数据打印
22
。伙计,非常感谢。我开始阅读更多关于Comparator的内容,您的解决方案在这方面真的很有帮助。我真的非常感谢所有的帮助!
List<Integer> numList = List.of(5, 10, 15, 20, 22, 1);
System.out.println(minVal(numList, Integer::compare));