函数对象
函数对象
* 一种将函数作为参数传递的独创方法 是注意到 在我们想传递的参数 即包含数据 也保包含方法,于是我们可以定义一个
* 不包含数据 只 包含方法的类,并传递该类的一个实例,事实上,一个函数通过将其放在一个对象内部而被传递,这样的对象
* 通常称为函数对象
package javabean.newTest51; import com.sun.istack.internal.localization.NullLocalizable; import com.sun.xml.internal.bind.AnyTypeAdapter; import javabean.newTest51.javabean.CaseInsensitiveCompare; import javabean.newTest51.javabean.Circle; import javabean.newTest51.javabean.Shape; import javabean.newTest51.javabean.Square; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; /** * 2018/5/1 * 陈东 * 函数对象 */ public class Test { public static <AnyType> boolean contains(AnyType []arr,AnyType x){ return false; } public static double toTalArea(Collection<? extends Shape> shapes){ int toTalArea = 0; for (Shape s:shapes ) { if (s!=null){ toTalArea+=s.area(); } } return toTalArea; } @org.junit.Test public void test(){ Collection<Square> squares = new ArrayList<Square>(); Square square1 = new Square(6.0,7.0); Square square2 = new Square(5,3); squares.add(square1); squares.add(square2); System.out.println(Test.toTalArea(squares)); } /** * 函数对象 * 一种将函数作为参数传递的独创方法 是注意到 在我们想传递的参数 即包含数据 也保包含方法,于是我们可以定义一个 * 不包含数据 只 包含方法的类,并传递该类的一个实例,事实上,一个函数通过将其放在一个对象内部而被传递,这样的对象 * 通常称为函数对象 */ public static <AnyType> AnyType findMax(List<AnyType> anyTypes, Comparator<? super AnyType> cmp){ int maxindex = 0; for (int i=0;i<anyTypes.size();i++){ if (cmp.compare(anyTypes.get(i),anyTypes.get(maxindex))>0){ maxindex = i; } } return anyTypes.get(maxindex); } @org.junit.Test public void testFun(){ List<Shape> shapes = new ArrayList<>(); Square square = new Square(7.0,8.0); shapes.add(square); Circle circle = new Circle(8.0); shapes.add(circle); System.out.println(Test.findMax(shapes,new CaseInsensitiveCompare()).toString()); } @org.junit.Test public void testFUn() { List<Square> squares = new ArrayList<>(); Square square = new Square(7.0, 8.0); Square square2 = new Square(8.0, 8.0); Square square3 = new Square(7.0, 9.0); squares.add(square); squares.add(square2); squares.add(square3); Comparator<? super Square> cmp = new CaseInsensitiveCompare(); System.out.println(Test.findMax(squares,cmp).toString()); } }
涉及到的实体类
package javabean.newTest51.javabean; import java.util.Comparator; public class CaseInsensitiveCompare implements Comparator<Shape> { @Override public int compare(Shape shape1,Shape shape2){ if (shape2.area() < shape1.area()){ return 1; } return 0; } } package javabean.newTest51.javabean; public class Circle extends Shape{ private double circlelength; public double getCirclelength() { return circlelength; } public void setCirclelength(double circlelength) { this.circlelength = circlelength; } public Circle(Double d){ this.circlelength = d; } @Override public Double area(){ return 3.14*2*circlelength; }; @Override public String toString() { return "Cirle: banjing"+getCirclelength(); } } package javabean.newTest51.javabean; public abstract class Shape { public abstract Double area(); } package javabean.newTest51.javabean; public class Square extends Shape { private double lenhth; private double hehth; public void setLenhth(double lenhth) { this.lenhth = lenhth; } public double getLenhth() { return lenhth; } public void setHehth(double hehth) { this.hehth = hehth; } public double getHehth() { return hehth; } @Override public String toString() { return "Squre: heth:"+getHehth()+"le:"+getLenhth(); } public Square(double lenhth,double hehth){ this.hehth =hehth; this.lenhth = lenhth; } @Override public Double area(){ return hehth*lenhth; }; }