1. 动态代理

  在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理

1.1 静态代理实现  

  在讲动态代理之前,需要先讲下静态代理,静态代理就是通过proxy持有realObject的引用,并进行一层封装,从而达到增强的效果

需求:在target中的test方法中加上一些内容(打印结果前后加上日志内容)

a  简单直观的方法

接口

public interface InterfaceA {public void test();
}

Target类(在上面直接加内容)

public class Target implements InterfaceA{@Overridepublic void test() {System.out.println("日志开始");   //方法前加内容System.out.println("这世界会好吗");System.out.println("日志结束");  //方法后加内容}
}

这样写不够好,破坏了target这个类,万一其他地方需要调用这个方法有的地方需要这内容,有的地方不需要,但又不想要这个日志内容,这样就显得多余了,所以,该怎么解决这个问题呢?

解决方法:定义一个单独的类来实现这样的需求,这样一个类我们称为代理

代理类(Proxy)

public class Proxy implements InterfaceA{Target t = new Target();  //目标对象@Overridepublic void test() {System.out.println("日志开始"); //增强t.test();System.out.println("日至结束");}
}

测试类

public class ProxyTest {public static void main(String[] args) {Proxy p = new Proxy();p.test();}
}

当目标类中的某个方法需要加一些特定的内容(如事务),就可以在代理类中创建目标类的对象并在相应方法加上想要的内容(如事务),在代理类自身的方法内调用相应的方法即可,这样以来就实现了在Target类某个方法灵活加内容的需求,但是其也有一个问题,就是当Target类中有成百上千的方法,并且每个方法都需要加上内容,这时候代理类写起来会很麻烦,这个时候就需要动态代理

1.2 动态代理的实现

接口

1.3 java8新特性

新特性概览:
  1. 接口中的默认方法与静态方法(即接口中不是只能有抽象方法了)
  2. Lambda 表达式
  3. 集合中的Stream
  4. DateApi
  5. 其他
    String: join
    String str = String.join(",", "a", "b", "c");

1.3.1. lambda表达式

1. 使用lambda表达式的前提:

  具有函数式接口(只包含一个抽象方法的接口(SAM),其他实现了的方法可以有多个)

2. 格式: 

  lambda 表达式实际上就是代码块的传递的实现。其语法结构如下:
  (parameters) -> expression 或者(parameters) -> {statements;}

注意事项:

  a. 括号里的参数可以省略其类型,编译器会根据上下文来推导参数的类型,也可以显式的指定参数类型,如果没有参数,括号内可以为空

  b. 方法体,如果有多行功能语句用大括号括起来,如果只有一行功能语句则可以省略大括号

  c. 可替代匿名内部类

方法的引用(不太懂):

方法引用,方法引用是lambda 表达式的一种简写形式。如果lambda 表达式只是调用一个特定的已经存在的方法,则可以使用方法引用。

使用“::”操作符将方法名和对象或类的名字分隔开来。以下是四种使用情况:
  对象::实例方法
  类::静态方法
  类::实例方法
  类::new

Arrays.sort(str, (o1,o2)->o1.compareToIgnoreCase(o2));
Arrays.sort(strings, String::compareToIgnoreCase);

案例1:以线程为例

正常开启一个线程的代码如下:

public class LambdaDemo {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("哈哈");}}).start();;}
}

分析:Thread里面一定是runnable对象,所以此可以省略掉,此外,runnable里面只有run方法,所以也可以省略,简化后的代码就变成如下:

public class LambdaDemo {public static void main(String[] args) {new Thread(() {     // 此处的小括号不能省略,有可能要传参数System.out.println("哈哈");}).start();;}
}

如果实现的抽象方法只有一行,那么大括号也可以省略,用lambda得到的代码如下

public class LambdaDemo {public static void main(String[] args) {new Thread(()-> System.out.println("哈哈")).start();;}
}

lambda表达式只关注接口中方法的参数,以及方法是怎么实现的

案例2:list的降序排序

未使用lambda表达式

public class LambdaDemo {public static void main(String[] args) {List<Integer> list = Arrays.asList(1,3,6,12,14,27); Collections.sort(list, new Comparator<Integer>() {  //实现降序排序
            @Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn o2-o1;}});}
}

lambda表达式

public class LambdaDemo {public static void main(String[] args) {List<Integer> list = Arrays.asList(1,3,6,12,14,27); Collections.sort(list, (o1,o2)-> o2-o1);}  // 遍历此list  list.forEach((t)->System.out.print(t))  // 将上面遍历进一步改为方法引用  list.forEach(System.out::print)
}

此处o1,o2的类型可以省略,如上,编译器会根据上下文自动推断出其类型,此处为Integer类型

案例3:map的遍历(常规方法有三种,见以前笔记)

lambda形式

public class LambdaDemo1 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "a");map.put(2, "b");map.put(3, "c");map.put(4, "d");map.forEach((k,v)->System.out.println(k+":"+v));}
}

1.3.2 stream

Stream是Java 8 提供的高效操作集合类(Collection)数据的API

1. 如何获取Stream

(1)使用集合创建

public static Stream<Integer> getStream() {List<Integer> list = Arrays.asList(1,2,3,5,32,24);return list.stream();
}

(2)使用数组创建

String[] arr = new String[] {"James","Wade","Kobe","Jardon"};
return Arrays.stream(arr);

(3)使用value创建

return Stream.of("哈哈","呵呵","嘿嘿"); 

(4)使用iterate创建

return Stream.iterate("h", n->n+5).limit(10);

(5)使用generate

return Stream.generate(Math::random).limit(20);

2. Stream中常用操作

(1)forEach:循环输出

(2)filter:帅选

(3)limit:限制取多少个

(4)sorted:

(5)join:将Stream转成字符串

public class StreamDemo1 {public static void main(String[] args) {Stream<String> s4 = Stream.of("I","Love","u");String s8 = s4.collect(Collectors.joining(" "));System.out.println(s8);//I Love uStream<String> s5 = Stream.of("I","Love","u");String s9 = s5.collect(Collectors.joining(",","{","}"));System.out.println(s9);//{I,Love,u}
    }
}

(6)distinct:去重

Stream.of("aa","bb","aa").distinct().forEach(System.out::print);//aabb

(7)map:对每一个元素进行操作

(8)reduce:归并

(9)collection:收集(将流转成集合)

1.3.3DateApi

  jdk8中这个特性使得日期和时间可以分离开(以前的date是连在一起的),其通过三个类实现,如下

public class DateApiDemo {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();//当前时间(日期和时间)System.out.println(now); //2019-09-02T16:59:29.862366800LocalDate now1 = LocalDate.now();//日期System.out.println(now1);//2019-09-02LocalTime now2 = LocalTime.now();//时间System.out.println(now2);//17:03:32.698811500
    }
}

把LocalDateTime转成想要的格式(使用DateTimeFormatter)

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(now.format(dtf)); // 2019-09-02 17:12:36

把字符串转成LocalDateTime

LocalDateTime ldt1 = LocalDateTime.parse("2019-09-02 17:12:36",dtf);
System.out.println(ldt1);//2019-09-02T17:12:36

此外,此新特性可以得到单独的年,月(中文和英文),日(某个月的第几天,以及某年的第几天)

System.out.println(now.getYear());//2019    获取年份
System.out.println(now.getMonth());//SEPTEMBER   获取英文的月份
System.out.println(now.getMonthValue());//9    获取中文的月数
System.out.println(now.getDayOfMonth());//2     获取该时间中天数属于该时间的月中的第几天
System.out.println(now.getDayOfYear());//245    获取该时间中天数属于该时间的年中的第几天

将确定的时间以单独的年、月、日、小时等来修改来,其形式见下例:

// 修改年份
System.out.println(now); // 2019-09-02T19:30:51.234745600
LocalDateTime d2 = now.withYear(2020);
System.out.println(d2); // 2020-09-02T19:30:51.234745600
//修改月份
LocalDateTime d3 = now.withMonth(11);
System.out.println(d3); // 2019-11-02T19:30:51.234745600

转载于:https://www.cnblogs.com/jj1106/p/11447707.html

零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)相关推荐

  1. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  2. Java基础学习总结(55)——java8新特性:stream

    java作为开发语言中的元老已经度过了很多年,最新的java8为我们带来了一些新特性,这些特性可以在以后的工作中为我们的开发提供更多的便捷,现在就让我们看看最新的函数式编程风格怎么在实际的开发中使用.

  3. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

  4. 零基础学习java,这些书一定要看!

    学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出来给大家作为 ...

  5. 零基础学习Java培训有什么攻略

    零基础学习Java培训有什么攻略?java是主流编程语言之一,我们在学习Java的时候需要制定Java学习路线图,Java涉及到的知识点非常的多,我们该从何学起呢?怎么系统的学习呢?来看看下面的详细介 ...

  6. 零基础学习Java开发,这些学习笔记送给你!

    因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...

  7. 零基础学习Java开发,这些学习笔记送给你

    因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...

  8. 零基础学习java必须要了解的学习路线

    Java开发目前热火朝天,但是有传言说Java将被取代,当然那只是传言.今天小编来谈谈零基础学习Java必须了解的学习路线. 第一阶段:HTML+CSS 静态布局开始 有人肯能会说我是做后端的,前端的 ...

  9. 零基础学习Java真的很难?初学者必须了解的Java基础知识梳理

    作为最受欢迎的编程语言之一,Java是很多人转行的首选.对于零基础而言,在学习Java前要了解哪些语言特征和常识呢?下面,小编就来分享一下零基础学习Java者必须了解的Java语言常识以及知识. 从1 ...

  10. 小白零基础学习Java编程好学吗?

    Java作为一门基础性编程语言,伴随着IT行业的兴起.目前,学习Java的人变得越来越多,但是想要学好Java通过自学可没有那么容易,尤其是对于初学者而言.那么小白零基础学习Java编程好学吗? IT ...

最新文章

  1. C语言string.h常用函数总结
  2. 电气论文:负荷区间预测(机器学习简单实现)
  3. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
  4. Notes on language modeling-COMS W4705: Natural Language Processing-学习笔记
  5. LeetCode MySQL 602. 好友申请 II :谁有最多的好友(union all)
  6. 微软Windows7将捆绑杀软 众厂商面临生死抉择
  7. [Web 前端] MobX
  8. Atitit 标签式tab 切换的实现 Softdev=declare+intercept 申明+解释 软件=代码+文档 软件=数据结构+算法 软件=程序+数据+文档 申明式 decla
  9. 备考cfa一、二级的方法和资料
  10. 修改Linux系统最大TCP连接数限制
  11. magicbook linux系统换w7,荣耀MagicBook笔记本怎么安装win7系统
  12. Katana程序集列表
  13. api接口安全验证(sign签名和token验证)
  14. 单词快速记忆day40
  15. 投资基建无异扩大货币供应
  16. 内存寻址系列讲座-拨开云雾初见端倪
  17. Git上传文件不能超过100M的解决办法
  18. SYN Flood攻击防范技术白皮书
  19. 2021牛客多校1——J:Journey of Railway Stations(线段树)
  20. Kudu+Impala介绍

热门文章

  1. dumpbin的命令
  2. 信息收集-服务器信息
  3. 注册表项目不能删除的解决方案
  4. 腾讯IM接口封装PHP
  5. 召回率、精确率、精确度、F值
  6. 微信菜单 html页面添加的,微信公众号添加菜单栏外部链接(微信添加外部链接方法)...
  7. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读
  8. UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法
  9. 搭建一个ctf_荣耀,不是一个人的游戏。
  10. Unity3D开发之代码创建圆柱体