Java高级特性——Stream流+异常+其他特性

文章目录

  • Stream流体系
    • Stream流的三种方法
    • 收集stream流
  • 异常
    • 处理异常方式
      • 编译时异常
        • 默认处理throws
        • try-catch
        • 方法直接将异通过throws抛出去给调用者,调用者收到异常后直接捕获处理。
      • 运行时异常处理
      • 自定义异常
  • 其他特性
    • 可变参数
    • static应用:工具类+代码块+单例
    • 接口新增方法
    • 正则表达式
    • 不可变集合

本文介绍jdk8之后的一些新技术和异常,相关内容可以查看以前的博文: 添加链接描述

Stream流体系

作用:简化集合和数组操作的API

//过滤数组中第一个字母为张并且字母长度为3的名字
names.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3);

核心思想
(1)先得到集合或者数组的Stream流(就是一根传送带)
(2)把元素放上去
(3)然后就用这个Stream流简化的API来方便的操作元素
操作规范

Stream流的三种方法

(1) 获取stream流:创建一条流水线,并把数据放到流水线上进行操作。

List<String> l=new Arraylist<>();
Stream<String> s=l.stream();

Map<String,Integer> maps=new Hashmap<>();
Stream<String> keystream=maps.keySet.stream();
Stream<Integer> value=maps.values.stream();
Stream<<Map,Entry<String,Integer>> keyvalue=maps.entrySet().stream();

//数组拿stream流
Stream<String> nameStream=Array.stream(names);
Stream<String> nameStream=Stream.of(names);

(2)中间方法:流水线上的操作,一次操作完成之后,还可以进行另外的操作。

代码 属性
filter 对流中元素进行过滤
limit 获取前几个元素
skip() 跳过前几个元素
distinct() 去除流中重复的元素
concat(Stream a,Stream b) 合并流a和流b
list.stream().filter(s->s.startwith("张")).foreach(s->System.out.println(s));

long size=list.stream().filter(s->s.size==3).count();

list.stream().filter(s->s.startWith("张")).limit(2).forEach(System.out::println);
//当方法中s->System.out.println(s)参数相同可以使用方法引用.

//map加工方法:第一个参数是原材料,第二个参数是加工后的材料
list.stream().map(s->"黑马的"+s).forEach(System.out::println);
//把原来的名称加工成对象
list.stream().map(s ->new student(s)).forEach(System.out::println);

中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。在Stream流中无法直接修改集合、数组中的数据。

(3)终结方法:一个stream流只能有一个终结方法,是流水线上最后一个操作。

代码 属性
void forEach() 对流中的每个元素遍历
int count() 返回流中的元素数

终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

收集stream流

代码 属性
toList() 把元素收集到list集合
toSet() 把元素收集到set集合
toMap() 把元素收集到Map集合中

异常

基本含义:异常是程序在“编译”或者“执行”的过程中可能出现的问题,语法错误不算在异常体系中。 比如:数组索引越界、空指针异常、 日期格式化异常。
Java高级特性——Stream流+异常+其他特性_第1张图片Java高级特性——Stream流+异常+其他特性_第2张图片Java高级特性——Stream流+异常+其他特性_第3张图片Java高级特性——Stream流+异常+其他特性_第4张图片

处理异常方式

编译时异常

默认处理throws

(1)默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
(2)异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
(3)虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
(4)直接从当前执行的异常点干掉当前程序。
(5)后续代码没有机会执行了,因为程序已经死亡。
Java高级特性——Stream流+异常+其他特性_第5张图片

方法 throws 异常1 ,异常2 ,异常3 ..{}
//用在方法上,可以把方法内部出现的异常抛出给本方法的调用者
方法 throws Exception{}

缺点:这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。

try-catch

  try{       
  // 监视可能出现异常的代码!   
  }catch(异常类型1 变量){       
    // 处理异常   }
  catch(异常类型2 变量){     
    // 处理异常   }
标准写法:
   try{    // 可能出现异常的代码!}
     catch (Exception e){   
      e.printStackTrace(); // 直接打印异常栈信息
     }
Exception可以捕获处理一切异常类型

方法直接将异通过throws抛出去给调用者,调用者收到异常后直接捕获处理。

运行时异常处理

建议在最外层调用处集中捕获处理即可。

自定义异常

自定义编译时异常

(1)定义一个异常类继承Exception.
(2) 重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出,
作用:编译时异常是编译阶段就报错,提醒更加强烈.!

自定义运行时异常

(1)定义一个异常类继承RuntimeException.
(2)重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出!

其他特性

可变参数

作用:可变参数用在形参中可以接收多个数据。
格式:数据类型...参数名称
好处:传输参数非常灵活,方便。可以不传输参数,可以传输1个或者多个,也可以传输一个数组
本质:数组
注意:
1.一个形参列表中可变参数只能有一个
2.可变参数必须放在形参列表的最后面

static应用:工具类+代码块+单例

工具类:里面是一些静态方法,每个方法都是为完成一个公用的功能。
工具类不需要创建对象,直接调用类名访问即可,我们可以把工具类中的构造器私有化。

public class staticWay {
    private staticWay(){
    }
    public static String createCode(int n)
    {
        String code="";
        String data="abcdefghigklmnopqrstuvwxyz";

        Random r=new Random();
        for(int i=0;i<n;i++)
        {
            //获取随机索引对应的字符,连接给code
            int index=r.nextInt(data.length());
            code+=data.charAt(index);
        }
        return code;
    }
}

代码块:类的五大组成之一(成员变量+构造器+方法+代码块+内部类)定义在类中方法外。在Java类下,用{}括起来的代码。
1.静态代码块:static{}
随着类的加载而加载并且自动触发执行,只执行一次。
初始化类内的静态资源
2.构造代码块:{}(不多用)
每次创建对象的时候,调用构造器的执行前,就会先执行该代码块中的代码,用于初始化实例变量。

单例模式
(1)开发中遇到的问题可能有n种解法,其中最优的解法被称为设计模式。
(2)单例模式:保证系统应用该模式的这个类永远只有一个实例,一个类创建一个对象,可以节省空间。
(3)饿汉单例设计模式:用类获取对象的时候,对象已经创建好了

  • 定义一个类私有构造器
  • 定义静态变量存储一个对象
public class SingleMan {
  public static SingleMan instance=new SingleMan();
  private SingleMan(){
    }
 }
//主函数中:
SingleMan s=SingleMan.instance;

(4)懒汉单例设计模式:真正需要该对象的时候才去创建对象(延迟加载对象)

  • 定义一个类私有构造器
  • 定义一个静态变量存储一个对象
public class SingleMan  {
 //定义一个静态成员变量存储一个对象只加载一次
  public static SingleMan instance;
  private SingleMan (){
  }
  //定义一个方法,对外返回单例对象
  public static SingleMan getInstance(){
   if(instance==null){
    //第一次来拿对象需要创建
    instance=new SingleMan ();
    }
    return instacnce;
    }
  }
  //主函数中:
SingleMan s=SingleMan.getInstance();

接口新增方法

如何在丰富接口功能的同时又不对子类代码进行更改:允许接口中定义带有方法体的方法。

//默认方法:必须用default修饰,默认是public修饰(实例方法)
//过继给实现类,让实现类对象调用
   default void run(){
   }
 //静态方法:接口的静态方法,必须用接口来调用
  static void run(){
 }
 //私有方法:必须在接口的内部才能访问
 private void run(){
  }

正则表达式

1.正则表达式可以用一些规定的字符来指定规则,用来校验数据格式的合法性。
2.匹配规则:
3.在方法中的应用:

String replaceAll(String regex,String newStr) 按照正则表达式匹配的内容进行替换
String[] spilt(String regex) 按照正则表达式匹配的内容分割字符串,返回一个字符串数组

4.正则表达式爬取信息
Java高级特性——Stream流+异常+其他特性_第6张图片

不可变集合

  • 不可以被修改的集合,集合的数据项在创建的时候提供,并且在整个生命周期不可以被修改。
  • 原因:如果某个数据不可以被修改,把它防御性拷贝到不可变集合很不错+当集合对象被不可信的库调用时不可变形式是安全的。
  • 创建方法:
static list of(element) 创建一个指定元素的list集合对象
static set of(element) 创建一个具有指定元素的set集合对象
static map of(element) 创建一个具有指定元素的map集合对象

你可能感兴趣的:(Java语言基础,java)