1.Properties类

Properties

  1. package com.qfedu.test1Properties;
  2. import java.util.Properties;
  3. public class Demo2test {
  4. public static void main(String[] args) {
  5. Properties p = new Properties();
  6. //类似map集合 存数据
  7. p.put("01", "朱1");
  8. p.put("02", "朱2");
  9. //通过键取值
  10. System.out.println(p.get("01"));
  11. System.out.println(p.get("02"));
  12. }
  13. }

Properties可以从流中加载,欸有去读取这个文件,使用Properties讲数据加载出来,以后开发中后缀是 .properties的文件

Person1

  1. package com.qfedu.test1Properties;
  2. public class Person1 {
  3. public void test1() {
  4. System.out.println("test1");
  5. }
  6. }

Person2

  1. package com.qfedu.test1Properties;
  2. public class Person2 {
  3. public void test2(){
  4. System.out.println("test2");
  5. }
  6. }

Domo1

  1. package com.qfedu.test1Properties;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.lang.reflect.Constructor;
  7. import java.lang.reflect.Method;
  8. import java.util.Properties;
  9. public class Demo1 {
  10. public static void main(String[] args) throws Exception {
  11. File file = new File("D:\\eclipse-workspace\\day414\\src\\haha.txt");
  12. Properties properties = new Properties();
  13. //从输入字节流读取属性列表(键和元素对)键值对
  14. properties.load(new FileInputStream(file));
  15. String className = (String) properties.get("Class");
  16. String methodName = (String) properties.get("Method");
  17. Class<?> aClass1 = Class.forName(className);
  18. Method method = aClass1.getMethod(methodName, null);
  19. Constructor<?> constructor = aClass1.getConstructor(null);
  20. Object object = aClass1.newInstance();
  21. method.invoke(object, null);
  22. }
  23. }

一、lambda表达式【难】

有一个接口,方法参数是一个接口(且下面只有一个方法),可以使用lambda表达式

语法格式

  1. () -> sout();

1.入门案例

  1. package com.qfedu.test2lambda;
  2. //lambda 入门案例
  3. public class Demo1 {
  4. public static void main(String[] args) {
  5. //新建一个线程 runnable是一个接口 作为Thread类的一个参数
  6. new Thread(new Runnable() {
  7. @Override
  8. public void run() {
  9. System.out.println("匿名内部类的线程一种写法");
  10. }
  11. }).start();
  12. //lambda表达式的写法
  13. Runnable run = ()->System.out.println("这个是另外一种写法");
  14. new Thread(run).start();;
  15. }
  16. }

总结

方法的参数是一个接口,,接口只有一个需要重写的方法。这个接口对象可以不用new了,直接用lambda表达式。

语法格式:

  1. 接口 接口名字 = (参数)->重写的内容;
  2. 接口 接口名字 = (参数)->{重写的内容;};
  3. ():接口下面的方法 可以是有参数的。
  4. 重写的方法:代码体,输出语句等。

2.1无参无返回值

  1. package com.qfedu.test2lambda;
  2. interface A {
  3. public void eat();//无参无返回值
  4. }
  5. public class Demo2 {
  6. public static void main(String[] args) {
  7. test(() -> System.out.println("吃饭"));
  8. }
  9. public static void test(A a) {
  10. a.eat();
  11. }
  12. }

2.2有参无返回值

  1. package com.qfedu.test2lambda;
  2. //有参无返回值的写法
  3. interface B{
  4. public void sleep(String name);//有参无返回值
  5. }
  6. public class Demo3 {
  7. public static void main(String[] args) {
  8. // B b = new B() {
  9. //
  10. // @Override
  11. // public void sleep(String name) {
  12. // System.out.println(name);
  13. //
  14. // }
  15. // };
  16. //
  17. B b = (String name)->System.out.println(name);
  18. test(b, "睡觉");
  19. }
  20. public static void test(B b,String name) {
  21. b.sleep(name);
  22. }
  23. }

2.3无参有返回值

注意 有返回值的 -> 后面的表达式需要{}括起来

  1. package com.qfedu.test2lambda;
  2. //无参有返回值
  3. interface C{
  4. public int add();
  5. }
  6. public class Demo4 {
  7. public static void main(String[] args) {
  8. // C c = new C() {
  9. //
  10. // @Override
  11. // public int add() {
  12. // // TODO Auto-generated method stub
  13. // return 4;
  14. // }
  15. // };
  16. C c = () -> {return 4;};
  17. test(c);
  18. }
  19. public static void test(C c) {
  20. int a = c.add();
  21. System.out.println(a);
  22. }
  23. }

2.4有参数有返回值

  1. package com.qfedu.test2lambda;
  2. //有参数有返回值
  3. interface D{
  4. public int add(int a, int b);
  5. }
  6. public class Demo5 {
  7. public static void main(String[] args) {
  8. // D d = new D() {
  9. //
  10. // @Override
  11. // public int add(int a, int b) {
  12. // int sum1 = a + b;
  13. // return sum1;
  14. // }
  15. // };
  16. D d = (int a, int b) ->{int sum1 = a+b;return sum1;};
  17. test(d, 3, 4);
  18. test((int a, int b) ->{int sum1 = a+b;return sum1;},3,5);
  19. }
  20. public static void test(D d,int a, int b) {
  21. int sum = a + b;
  22. System.out.println(sum);
  23. }
  24. }

注意事项

使用lambda表达式,接口下面不允许有多个方法,这是个局限性

真是开发,如果接口只有一个参数,可以不用new,直接使用lambda

2.5 lambda遍历

写法 集合.forEach(System.out::println)

  1. package com.qfedu.test2lambda;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //lambda表达式遍历
  5. public class Demo6 {
  6. public static void main(String[] args) {
  7. List<String> list = new ArrayList<String>();
  8. list.add("啊");
  9. list.add("吧");
  10. list.add("从");
  11. //增强foreach循环遍历
  12. // for (String s1 : list) {
  13. // System.out.println(s1);
  14. // }
  15. //lambda遍历
  16. list.forEach(System.out::println);
  17. }
  18. }

二、Stream流【难点】

需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的

  1. package com.qfedu.test3Stream;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.jar.Attributes.Name;
  5. //需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的
  6. public class Demo1 {
  7. public static void main(String[] args) {
  8. List<String> list = new ArrayList<String>();
  9. list.add("张一");
  10. list.add("张二三");
  11. list.add("朱四五");
  12. list.add("张六七");
  13. list.add("张八九");
  14. //用来存姓张的集合
  15. List<String> list1 = new ArrayList<String>();
  16. for (String s1 : list) {
  17. //取出首字是张的 startWith
  18. if (s1.startsWith("张")) {
  19. list1.add(s1);
  20. }
  21. }
  22. System.out.println(list1);
  23. //用来存姓张的且是三个字的集合
  24. List<String> list2 = new ArrayList<String>();
  25. for (String s2 : list1) {
  26. //字符串长度为三的
  27. if (s2.length() == 3) {
  28. list2.add(s2);
  29. }
  30. }
  31. System.out.println(list2);
  32. }
  33. }

使用Stream流进行操作,获取流对象,过滤操作,输出打印

  1. package com.qfedu.test3Stream;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的
  5. //用Stream流进行操作需求 stream流中的filter过滤方法
  6. public class Demo2 {
  7. public static void main(String[] args) {
  8. List<String> list = new ArrayList<String>();
  9. list.add("张一");
  10. list.add("张二三");
  11. list.add("朱四五");
  12. list.add("张六七");
  13. list.add("张八九");
  14. //链式操作
  15. list.stream()
  16. .filter((String name)->name.startsWith("张"))
  17. .filter((String name)->name.length() == 3)
  18. .forEach((String name)->System.out.println("过滤出来的姓名为:" + name));
  19. // .forEach(System.out::println);;
  20. }
  21. }

分析代码

  1. list.stream() 将集合数据存到stream流中
  2. .filter((String name)->name.startsWith("张")) 过滤姓张的值
  3. .filter((String name)->name.length() == 3) 过滤姓张长度为3
  4. .forEach((String name)->System.out.println("过滤出来的姓名为:" + name)); 过滤完之后进行遍历打印

2.1获取流

只有集合和数组才能变成流对象,单个数据元素没法变成流对象

根据集合获取流,因为集合中有数据

Collection获取流:

  1. default Stream streadm() 不是抽象方法

返回一个顺序Stream与此集合作为其来源。就是数据源[1,2,3]把这个集合变成流对象了

1.根据list获取流对象

  1. List<String> list = new ArrayList<String>();
  2. list.add("张一");
  3. list.add("张二三");
  4. list.add("朱四五");
  5. list.add("张六七");
  6. list.add("张八九");
  7. //获取流对象
  8. Stream<String> stream = list.stream();
  9. System.out.println(stream);

2.根据set集合获取流对象

  1. Set<String> set = new HashSet<String>();
  2. set.add("艾斯");
  3. set.add("萨博");
  4. set.add("路飞");
  5. Stream<String> stream2 = set.stream();
  6. System.out.println(stream2);

3.根据map集合获取流对象

  1. Map<Integer, String> map = new HashMap<Integer, String>();
  2. map.put(1, "王路飞");
  3. map.put(2, "刘索隆");
  4. map.put(3, "马山治");
  5. //根据map集合中的键获取流对象
  6. Set<Integer> set3 = map.keySet();
  7. Stream<Integer> stream3 = set3.stream();
  8. //根据map集合中的值获取流对象
  9. Collection<String> collection = map.values();
  10. Stream<String> stream4 = collection.stream();
  11. //根据map集合的键值对实体对象获取流对象
  12. Set<Map.Entry<Integer, String>> map2 = map.entrySet();
  13. Stream<Map.Entry<Integer,String>> stream5 = map2.stream();

4.根据数组获取流对象

  1. String[] arr = {"朱志伟","朱航","杨博"};
  2. Stream<String> stream6 = Stream.of(arr);

2.2流下面的方法

流就是集合中的数据,对集合中的数据进行操作

方法名称 方法的作用 方法的种类 是否支持链式操作
count 统计个数 终结方法
forEach 逐个处理数据 终结方法
filter 过滤数据 函数拼接
limit 取前几个 函数拼接
skip 跳过前几个 函数拼接
map 映射 函数拼接
concat 拼接组个 函数拼接

方法种类:

  1. 终结方法:对流操作的时候,这个方法在链式操作里一定是写在最后的
  2. 函数拼接:这个函数后面还可以继续写函数

2.2.1count和forEach方法

count:统计流中元素的个数,返回值long。

forEach:遍历数据的

这两个都是终结方法,后面不能在跟方法了

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //count和forEach方法
  5. public class Demo1 {
  6. public static void main(String[] args) {
  7. List<String> list = new ArrayList<String>();
  8. list.add("张一");
  9. list.add("张二三");
  10. list.add("朱四五");
  11. list.add("张六七");
  12. list.add("张八九");
  13. //count 统计
  14. long count = list.stream().count();
  15. System.out.println(count);//5
  16. //forEach 遍历 name是遍历数据是的一个临时数据
  17. list.stream().forEach((String name)->{System.out.println(name);});
  18. }
  19. }

2.2.2filter方法

Stream filter(Predicate<? super T> predicate)

Predicate是一个接口,下面只有一个test(T t)返回值为boolean

因此可使用lambda表达式简写

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.function.Predicate;
  5. import java.util.jar.Attributes.Name;
  6. //filter
  7. public class Demo2 {
  8. public static void main(String[] args) {
  9. List<String> list = new ArrayList<String>();
  10. list.add("张一");
  11. list.add("张二三");
  12. list.add("朱四五");
  13. list.add("张六七");
  14. list.add("张八九");
  15. // Predicate<String> predicate = new Predicate<String>() {
  16. // @Override
  17. // public boolean test(String t) {
  18. // // TODO Auto-generated method stub
  19. // return false;
  20. // }
  21. // };
  22. //filter 意思是 看数据流返回是一个true,就把它留在流里,false就清除掉
  23. list.stream()
  24. .filter((String Name) -> {return Name.startsWith("朱");})
  25. .forEach((String name)->{System.out.println(name);});;
  26. }
  27. }

2.2.3limit方法

限制,给一个参数,取前几个值。

参数类型 long

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //limit方法
  5. public class Demo3limit {
  6. public static void main(String[] args) {
  7. List<String> list = new ArrayList<String>();
  8. list.add("张一");
  9. list.add("张二三");
  10. list.add("朱四五");
  11. list.add("张六七");
  12. list.add("张八九");
  13. list.stream().limit(3).forEach((String name)->{System.out.println(name);;});
  14. //取前三个中姓张的
  15. list.stream()
  16. .limit(3)
  17. .filter((String name)->{return name.startsWith("张");})
  18. .forEach((String name)->{System.out.println(name);;});
  19. }
  20. }
  21. 张一
  22. 张二三
  23. 朱四五
  24. 张一
  25. 张二三

2.2.4map方法

用来映射数据的

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.function.Function;
  5. //map方法 映射数据 valueOf parseInt 都可以将字符串转换为int数据
  6. public class Demo4map {
  7. public static void main(String[] args) {
  8. List<String> list = new ArrayList<String>();
  9. list.add("11");
  10. list.add("12");
  11. list.add("13");
  12. //将上面字符串数据转换成int类型数据
  13. // Function<String, Integer> function = new Function<String, Integer>() {
  14. // @Override
  15. // public Integer apply(String t) {
  16. //
  17. // return Integer.parseInt(t);
  18. // }
  19. // };
  20. // list.stream().map(function).forEach((Integer a)->{System.out.println(a);;});
  21. list.stream()
  22. .map((String t)->{return Integer.valueOf(t);})
  23. .forEach((Integer a)->{System.out.println(a);});
  24. }
  25. }

2.2.5skip方法

跳过前几个去执行

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.jar.Attributes.Name;
  5. //跳过前几个值,去取之后的
  6. public class Demo5skip {
  7. public static void main(String[] args) {
  8. List<String> list = new ArrayList<String>();
  9. list.add("张一");
  10. list.add("张二三");
  11. list.add("朱四五");
  12. list.add("张六七");
  13. list.add("张八九");
  14. list.stream()
  15. .skip(3)
  16. .forEach((String Name)->{System.out.println(Name);});
  17. }
  18. }
  19. 张六七
  20. 张八九

2.2.6concat方法

拼接,合并两个流

  1. package com.qfedu.test3StreamMethod;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.stream.Stream;
  5. public class Demo6concat {
  6. public static void main(String[] args) {
  7. List<String> list = new ArrayList<String>();
  8. list.add("张一");
  9. list.add("张二三");
  10. list.add("朱四五");
  11. list.add("张六七");
  12. list.add("张八九");
  13. List<String> list1 = new ArrayList<String>();
  14. list1.add("11");
  15. list1.add("12");
  16. list1.add("13");
  17. //集合合并方法
  18. list.addAll(list1);
  19. //流合并的方法 concat是stream流的一个静态方法
  20. Stream<String> stream = Stream.concat(list.stream(), list1.stream());
  21. stream.forEach((String a)->{System.out.println(a);});
  22. }
  23. }

2.3收集Stream流

toList();将流转换为list集合

toset();将流转换为set集合

  1. package com.qfedu.test4liu_jihe;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Set;
  5. import java.util.stream.Collectors;
  6. import java.util.stream.Stream;
  7. public class Demo1 {
  8. public static void main(String[] args) {
  9. List<String> list = new ArrayList<String>();
  10. list.add("张一");
  11. list.add("张二三");
  12. list.add("朱四五");
  13. list.add("张六七");
  14. list.add("张八");
  15. //过滤出姓张的,且长度为3的
  16. Stream<String> stream = list.stream()
  17. .filter((String name)->{return name.startsWith("张");})
  18. .filter((String name)->{return name.length()==3;});
  19. List<String> list2 = stream.collect(Collectors.toList());
  20. System.out.println(list2);
  21. //因为list使用流之后就关闭了
  22. // Set<String> set = stream.collect(Collectors.toSet());
  23. // System.out.println(set);
  24. }
  25. }