0306


匿名内部类和lambda表达式都可以直接访问effectively final局部变量,以及外部类的成员变量包括成员变量和类变量。lambda表达式和匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。
区别:1、为接口创建实例:lambda只能为函数式接口创建;匿名内部类不管接口有几个抽象方法,只要实现就可以。匿还可以为抽象类或者普通类创建实例。
2、匿名实现的抽象方法的方法体中可以调用接口中的默认方法,lambda不行。
@FunctionalInterface
interface Displayable
{
	void display();
	default int add(int a,int b)
	{
		return a+b;
	}
}
public class LambdaAndInner 
{
	private int age=12;
	private static String name="小明";
	public void test()
	{
		String book="书";    
		Displayable dis=new Displayable()
				{  @Override
			        public void display()
			        {
				           add(3, 5);    //匿名内部类实现的抽象方法的方法体内允许调用接口中的默认方法,lambda中不行,下面方法体中如果加入这局就报错。
			        }
				};
		/*Displayable dis=()->
		{
			System.out.println("book局部变量为:"+book);   //lambda表达式访问了局部变量 相当于final修饰 所以不能再赋值。"effectively final"
			System.out.println("外部类的age实例变量为:"+age);
			System.out.println("外部类的name实例变量为:"+name);
		};*/
		dis.display();
		System.out.println(dis.add(3, 5));
	}
	public static void main(String[]args)
	{
		LambdaAndInner lai=new LambdaAndInner();
		lai.test();
	}
}

Comparator是函数式接口,只有compare()方法是SAM,另一个equals()是override。
import java.util.*;
import java.util.function.*;

public class LambdaArrays
{
	public static void main(String[] args)
	{
		String[] arr1 = new String[]{"java" , "fkava" , "fkit", "ios" , "android"};
		Arrays.parallelSort(arr1, (o1, o2) -> o1.length() - o2.length());   //Comparator接口,没给的话怎么知道哪个接口?(方法api,形参列表里有接口名)
/*     lambda表达式对应的匿名内部类形式如下
*		按顺序排列数组arr1,返回负数 升序排列,整数降序。至于如何实现不用管(看源码)。
*		Arrays.parallelSort(arr1, 
*				new Comparator<String>()                                 //泛型?
*		        {
*			    @Override
*			    public int compare(String o1,String o2)
*			        {
*			    	return o1.length()-o2.length();
*		        	}
*		        } );
*/		
		System.out.println(Arrays.toString(arr1));
		
		double[] arr2 = new double[]{3, -4 , 25, 16, 30, 18};
	//好像是第一个数不变,后面的累+-*/
		Arrays.parallelPrefix(arr2, (left, right)-> left + right);
/*		new IntBinaryOperator()
		{
			@Override
			public int applyAsInt(int left,int right)
			{
				return left+right;
			}
		};
*/		
		System.out.println(Arrays.toString(arr2));
		
		long[] arr3 = new long[5];
		// operand代表正在计算的元素索引
		Arrays.parallelSetAll(arr3 , operand -> operand*2);
/*		new IntToLongFunction()
		{
			@Override
			public long applyAsLong(int operand)
			{
				return operand*5;
			}
		};
*/		
		System.out.println(Arrays.toString(arr3));
	}
}

猜你喜欢

转载自huadianfanxing.iteye.com/blog/2360629