- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在学习 lambda 表达式和函数式接口(interface)。我们可以通过 lambda 表达式直接编写接口(interface)的实现。所以我认为,它可能是多态性的替代方案。
我有一些使用多态的代码,
interface Drawable {
public void draw();
}
class Shape {
protected String name;
public Shape(String name) {
this.name = name;
}
}
class Rectangle extends Shape implements Drawable {
public Rectangle(String name) {
super(name);
}
@Override
public void draw() {
System.out.println("I am "+this.name);
System.out.println("Drawing rectangle with 2 equal sides.");
}
}
class Square extends Shape implements Drawable {
public Square(String name) {
super(name);
}
@Override
public void draw() {
System.out.println("I am "+this.name);
System.out.println("Drawing square with 4 equal sides.");
}
}
public class DrawShape {
public static void main(String ar[]) {
Drawable rectangle = new Rectangle("Rectangle");
rectangle.draw();
Drawable square = new Square("Square");
square.draw();
}
}
我已经使用 lambda 表达式和函数式接口(interface)编写了上面的代码,
@FunctionalInterface
interface Drawable {
public void draw();
}
class Shape {
private String name;
public Shape(String name) {
this.name = name;
}
public void draw(Drawable d1) {
System.out.println("I am "+this.name);
d1.draw();
}
}
public class DrawShape {
public static void main(String[] args) {
Shape s1 = new Shape("Rectangle");
Drawable rectangle = () -> System.out.println("Drawing rectangle with 2 equal sides.");
s1.draw(rectangle);
Shape s2 = new Shape("Square");
Drawable sqaure = () -> System.out.println("Drawing square with 4 equal sides.");
s2.draw(sqaure);
}
}
哪种方法更好?lambda的代码复用性、代码维护和修改、耦合和内聚等其他方面呢?
最佳答案
我认为 lambda 表达式允许开发人员编写完全多态的类型,就像完整的类实现一样。
多态性通常以两种方式出现:
Drawable drawable = new Rectangle("name");
drawable.draw();
Shape shape = (Shape) drawable; //same object, multiple types.
还有:
Drawable drawable2 = new Rectangle("name");
drawable2.draw(); //Rectangle.draw() implementation invoked
drawable2 = new Square("name");
drawable2.draw(); //Square.draw() implementation
这两者都不能完全被 lambda 表达式所允许:
虽然可以这样做:
Drawable drawable = () -> System.out.println("drawing rectangle");
drawable = () -> System.out.println("drawing square");
这与上面的第二个代码片段并不完全相同(在更复杂的示例中,可以在 Shape
中提供基本实现,并在 中覆盖它Rectangle
和 Square
; 而这对于 lambdas 是不可能的)。此外,有人认为上述两个分配使用不同的源代码是正确的。
不能像使用类一样“转换”类型:
Drawable drawable3 = () -> System.out.println("Drawing something");
Shape shape3 = (Shape) drawable3; //Class cast exception.
换句话说,lambda 表达式非常适合函数式编程编码,不是良好的面向对象设计的替代品。
关于java - lambda 表达式可以替代多态性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605649/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!