Java Workshop 7
- fixed abstrack method takes prameter as an varargs
- improuve namve of interface and abstract method more general
- eventually, getProperty method deosn’t take any parameters for better utilization
@FunctionalInterface
public interface ShapeProperty { 
    double getProperty(double... d);  // varargs takes parameter as an array
}
Traditional way to define functional interface’s method
public class Rectangle extends Parallelogram { 
   private ShapeProperty property = new ShapeProperty() {  
		@Override
		public double getProperty(double... d) {
			return d[0] * d[1];
		}
	};
	public Rectangle(double width, double height) throws ParallelogramException{
			super(width, height); 
	}
	public ShapeProperty getArea(){
	    return property;
    }
	@Override
	public String toString(){ //return string 
		return "Rectangle {w=" + getWidth() + ", h=" + getHeight() + "}" +
				" perimeter = " + perimeter() + " area = " + property.getProperty(getWidth(), getHeight());
	}
}
Lambda Expression to define functional interface’s method
public class Rectangle extends Parallelogram { 
    private ShapeProperty property = wh -> wh[0] * wh[1];
	public Rectangle(double width, double height) throws ParallelogramException{
			super(width, height); 
	}
	public ShapeProperty getArea(){
	    return property;
    }
	@Override
	public String toString(){ //return string 
		return "Rectangle {w=" + getWidth() + ", h=" + getHeight() + "}" +
				" perimeter = " + perimeter() + " area = " + property.getProperty(getWidth(), getHeight());
	}
}
Best Solution for functional interface
@FunctionalInterface
public interface ShapeProperty { 
    double getProperty(); 
}
public class Rectangle extends Parallelogram { 
    private ShapeProperty property = () -> getWidth() * getHeight();
	public Rectangle(double width, double height) throws ParallelogramException{
			super(width, height); 
	}
	public ShapeProperty getArea(){
	    return property;
    }
	@Override
	public String toString(){ //return string 
		return "Rectangle {w=" + getWidth() + ", h=" + getHeight() + "}" +
				" perimeter = " + perimeter() + " area = " + property.getProperty();
	}
}