java8的新特性

时间:2019-04-18
本文章向大家介绍java8的新特性,主要包括java8的新特性使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

java8的性特性

java8的新特性简化了以前代码不必要的长度,加快了其运算速度;

  1. java8引入Lambda
    java8中引入了Lambda;其简化了代码列如:
//没有使用java8特性
public class Test {

	static List<User> users = Arrays.asList(new User(1, "张三", 2),
			new User(2, "李四", 4),
			new User(3, "王五", 18),
			new User(4, "赵六", 13));
	
	public static void main(String[] args) {
		//使用匿名内部类的方式根据人的年龄进行升序
		Comparator<User> comparator = new Comparator<User>() {

			@Override
			public int compare(User o1, User o2) {
				return o1.getAge()-o2.getAge();
			}
		};
		Collections.sort(users, comparator);
		for (User user : users) {
			System.out.println(user);
		}
	}
}
public class Test {
	//使用Lambda后的代码
	static List<User> users = Arrays.asList(new User(1, "张三", 2),
			new User(2, "李四", 4),
			new User(3, "王五", 18),
			new User(4, "赵六", 13));
	
	public static void main(String[] args) {
		//使用匿名内部类的方式根据人的年龄进行升序
		Collections.sort(users, (u1,u2)->u1.getAge()-u2.getAge());
		for (User user : users) {
			System.out.println(user);
		}
	}
}

使用java8的特性Lambda后代码量减少了很多
Lambda允许把函数作为一个方法的参数,或者把代码看成数据。
为了使现有函数更好的支持Lambda表达式,Java 8引入了函数式接口的概念。函数式接口就是只有一个方法的普通接口。
java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的例子
添加了一个注解@FunctionalInterface 用来标注该类为函数式接口
也可以简洁的代码的开发例如 使用@FunctionalInterface

@FunctionalInterface
public interface FilterInfo<T> {

	boolean pro(T t);
}
public class Test {

   static List<User> users = Arrays.asList(new User(1, "张三", 2),
   		new User(2, "李四", 4),
   		new User(3, "王五", 18),
   		new User(4, "赵六", 13),
   		new User(5, "马", 1));
   
   public static void main(String[] args) {
   	//编号大于2且年龄大于4的人
   	List<User> userInfo = people(users, (e)->((User) e).getId()>2);
   	userInfo = people(userInfo, (a)->((User) a).getAge()>4);
   	for (User user : userInfo) {
   		System.out.println(user);
   	}
   }
   
   public static List<User> people(List<User> users,FilterInfo filterInfo) {
   	List<User> user = new ArrayList<>();
   	for (User user2 : users) {
   		if (filterInfo.pro(user2)) {
   			user.add(user2);
   		}
   	}
   	return user;
   }
}


个人感觉没啥用和自己定义一个泛型类提出公用方法来使用没什么区别——————别喷、别喷、别喷
我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。例如:

public interface DefaultFunctionInterface {
     default String defaultFunction() {
         return "default function";
     }
 }

我们还可以在接口中定义静态方法,使用static关键字,也可以提供实现。
接口的默认方法和静态方法的引入,其实可以认为引入了C++中抽象类的理念,以后我们再也不用在每个实现类中都写重复的代码了。
其实Lambda表达式的写法理解起来是这样的(个人见解)
Collections.sort(users, (u1,u2)->u1.getAge()-u2.getAge());
users大家都可以理解 -> 的左侧是要入参的参数 右侧的是条件 列如在函数式接口中定义了一个boolean类型的抽象方法在引用时进行判断时右侧的就可以理解为if判断中的判断条件。也就是Lambda的重中之重 主体的表达式。