1. StringJoiner类

image.png
构造方法:(StringJoiner中没有无参构造 )
image.png
成员方法:
image.png
举个例子,把数组转成字符串:
image.png

2. Lambda表达式

练习1:使用Lambda求出整型数组元素之和

  1. interface Operator{
  2. public abstract int getSum(int[] arr);
  3. }
  4. public class OperatorDemo {
  5. public static void main(String[] args) {
  6. // 这是使用匿名内部类的方式
  7. method(new Operator() {
  8. @Override
  9. public int getSum(int[] arr) {
  10. int sum = 0;
  11. for(int num : arr) {
  12. sum += num;
  13. }
  14. return sum;
  15. }
  16. });
  17. // 使用Lambda表达式的方式 (IDEA中可以直接把匿名内部类转化为Lambda)
  18. method(arr -> {
  19. int sum = 0;
  20. for(int num : arr) {
  21. sum += num;
  22. }
  23. return sum;
  24. });
  25. }
  26. public static void method(Operator op) {
  27. int[] nums = {1,2,3,4,5};
  28. int sum = op.getSum(nums);
  29. System.out.println(sum);
  30. }
  31. }

练习2:使用函数式接口返回数组元素的最大值

  1. // Supplier接口,无参有返回值,供给型
  2. @FunctionalInterface
  3. public interface Supplier<T> {
  4. public abstract T get();
  5. }
  6. public class SupplierDemo {
  7. public static void main(String[] args) {
  8. // 这是使用匿名内部类的方式
  9. printMax(new Supplier() {
  10. @Override
  11. public Integer get() {
  12. int[] arr = {10, 20, 100, 30, 40, 50};
  13. Arrays.sort(arr);
  14. return arr[arr.length - 1];
  15. }
  16. });
  17. // 这是使用Lambda表达式的方式
  18. printMax(() -> {
  19. int[] arr = {10, 20, 100, 30, 40, 50};
  20. Arrays.sort(arr);
  21. return arr[arr.length - 1];
  22. });
  23. }
  24. private static void printMax(Supplier<Integer> supplier) {
  25. // 调用接口中的get方法
  26. int max = supplier.get();
  27. System.out.println("max = " + max);
  28. }
  29. }

练习3:使用Lambda表达式将一个字符串先转成小写,再转成大写。

  1. // Consumer消费型接口,可以拿到accept方法参数传递过来的数据进行处理, 有参无返回的接口
  2. public interface Consumer<T> {
  3. public abstract void accept(T t);
  4. }
  5. public class ConsumerDemo {
  6. public static void main(String[] args) {
  7. // 匿名内部类实现
  8. convert(new Consumer<String>() {
  9. @Override
  10. public void accept(String s) {
  11. System.out.println(s.toLowerCase());
  12. }
  13. }, new Consumer<String>() {
  14. @Override
  15. public void accept(String s) {
  16. System.out.println(s.toUpperCase());
  17. }
  18. });
  19. // 使用Lambda表达式实现
  20. convert(s -> System.out.println(s.toLowerCase()),
  21. s -> System.out.println(s.toUpperCase()));
  22. }
  23. // 先转成全小写,再转成全大写
  24. public static void convert(Consumer<String> c1, Consumer<String> c2) {
  25. String str = "Hello World";
  26. c1.accept(str);
  27. c2.accept(str);
  28. }
  29. }
  30. ------------------------------------------------------------------------------
  31. // 以上convert方法可以简化,可以使用Consumer 接口中的default方法 andThen进行简化
  32. // 通过链式写法可以实现更多步骤的组合
  33. public static void convert(Consumer<String> c1, Consumer<String> c2) {
  34. String str = "Hello World";
  35. c1.andThen(c2).accept(str);
  36. c2.andThen(c1).accept(str);
  37. }

练习4:使用Lambda表达式将字符串转成整型

  1. // Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据。前者T称为前置条件,后者R称为后置条件。有参数有返回值。
  2. @FunctionalInterface
  3. public interface Function<T, R> {
  4. public abstract R apply(T, t);
  5. }
  6. public class FunctionDemo {
  7. public static void main(String[] args) {
  8. // 匿名内部类实现
  9. str2num(new Function<String, Integer>() {
  10. @Override
  11. public Integer apply(String s) {
  12. return Integer.parseInt(s);
  13. }
  14. });
  15. // Lambda表达式实现(以下两种都可以)
  16. str2num(s -> Integer.parseInt(s));
  17. str2num(Integer::parseInt);
  18. }
  19. private static void str2num(Function<String, Integer> function) {
  20. Integer num = function.apply("1511711");
  21. System.out.println("res: " + (num + 5));
  22. }
  23. }

练习5:使用Lambda表达式先将一个字符串转为整型,再乘以10

  1. public class FunctionDemo {
  2. public static void main(String[] args) {
  3. // 匿名内部类实现
  4. test(new Function<String, Integer>() {
  5. @Override
  6. public Integer apply(String s) {
  7. return Integer.parseInt(s);
  8. }
  9. }, new Function<Integer, Integer>() {
  10. @Override
  11. public Integer apply(Integer i) {
  12. return i * 10;
  13. }
  14. });
  15. // Lambda表达式实现(以下两种都可以)
  16. test(s -> Integer.parseInt(s), i -> i * 10);
  17. test(Integer::parseInt, i -> i * 10);
  18. }
  19. private static void test(Function<String, Integer> f1, Function<Integer, Integer> f2) {
  20. // 先把字符串转为整型,再乘以10,输出结果
  21. Integer num = f1.apply("10086");
  22. Integer res = f2.apply(num);
  23. System.out.println(res);
  24. }
  25. ---------------------------------------------------------------------------------
  26. // Function 接口中有一个默认的 andThen 方法,用来进行组合操作
  27. private static void test(Function<String, Integer> f1, Function<Integer, Integer> f2) {
  28. Integer res = f1.andThen(f2).apply("10086");
  29. System.out.println(res);
  30. }
  31. }

练习6:使用Lambda判断一个人名如果超过3个字就认为是很长的名字

  1. public class PredicateDemo {
  2. public static void main(String[] args) {
  3. String name = "迪丽热巴";
  4. // 匿名内部类实现
  5. judgeName(new Predicate<String>() {
  6. @Override
  7. public boolean test(String s) {
  8. return s.length() > 3;
  9. }
  10. }, name);
  11. // Lambda表达式实现
  12. judgeName(s -> s.length() > 3, name);
  13. }
  14. private static void judgeName(Predicate<String> pre, String name) {
  15. boolean isLong = pre.test(name);
  16. System.out.println("isLong: " + isLong);
  17. }
  18. }

练习6:

  • 使用Lambda表达式判断一个字符串中即包含H,也包含W;
  • 使用Lambda表达式判断一个字符串中包含H或者包含W;
  • 使用Lambda表达式判断一个字符串中不包含W;

    1. public class PredicateDemo {
    2. public static void main(String[] args) {
    3. judgeAnd(new Predicate<String>() {
    4. @Override
    5. public boolean test(String s) {
    6. return s.contains("H");
    7. }
    8. }, new Predicate<String>() {
    9. @Override
    10. public boolean test(String s) {
    11. return s.contains("W");
    12. }
    13. });
    14. judgeAnd(s -> s.contains("H"), s -> s.contains("W"));
    15. judgeOr(s -> s.contains("H"), s -> s.contains("W"));
    16. judgeNegate(s -> s.contains("W"));
    17. }
    18. private static void judgeAnd(Predicate<String> p1, Predicate<String> p2){
    19. String str = "HelloWorld";
    20. // 判断包含大写“H”
    21. boolean b1 = p1.test(str);
    22. // 判断包含大写“W”
    23. boolean b2 = p2.test(str);
    24. System.out.println(b1 && b2 ? "满足条件" : "不满足");
    25. // 也可以这么写
    26. boolean b = p1.and(p2).test(str);
    27. System.out.println(b ? "and ✔" : "and ❌");
    28. }
    29. private static void judgeOr(Predicate<String> p1, Predicate<String> p2){
    30. String str = "XiaoMi";
    31. boolean b = p1.or(p2).test(str);
    32. System.out.println(b ? "or ✔" : "or ❌");
    33. }
    34. private static void judgeNegate(Predicate<String> p1) {
    35. String str = "XiaoMi";
    36. boolean b = p1.negate().test(str);
    37. System.out.println(b ? "negate ✔" : "negate ❌");
    38. }
    39. }

3. Stream流