可变参数

底层是一个数组,当传入的形参数量很庞大,不可能一个一个写上,就用可变参数的形式。

package myArg;

public class ArgsDemo {
    public static void main(String[] args) {

        System.out.println(gerSum(1, 2, 34, 5));

    }

    public static int gerSum(int...a){
        int sum = 0;
        for (int i : a) {
            sum = sum + i;
        }
        return sum;
    }

}

注意:

1.在方法的形参中最多写一个可变参数。

2.在方法中,除了可变参数外还有其他形参,可变参数要写在最后(因为可变参数会把所有数据都纳入到其中,若写在其他形参前,会把所有数据都当作可变参数中的数据)

Collections

collections是集合的工具类.为集合提供多种操作方法如:addAll(),shuffle()(打乱),sort(),binarySearch(),copy(),fill(),max/min(),swap()。

不可变集合

不可以被修改的集合,长度和内容都不能修改。

使用 集合.of 方法获得一个不可变的集合。只能进行查询操作,使用增删改会报错。

当获取一个不可变Set集合时,要注意保证其中的数据唯一。

不可变Map集合,保证键不重复,且其中可传递的数据有上限为10个键值对。如果想要传递超过10个键值对对象,可以使用ofEntries方法(将键值看为一个整体)实现。若想用ofEntries方法,还需先将传入的数据转为集合,使用toArray(new Map.Entry[0]),指定集合存入参数的类型为entry。也可以用copyof()方法,可以直接创建一个不可变集合(jdk10出现)。

Stream流

package Stream;

import java.util.ArrayList;

public class StreamDemo1 {
    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("aaa");
        list1.add("bbb");
        list1.add("aaaa");
        list1.add("ddd");
        list1.add("aaaaa");

        //这部分为不使用stream流的方式
//        System.out.println(list1);
//        System.out.println("----------------------");
//
//        ArrayList<String> list2 = new ArrayList<>();
//
//        for (String name : list1) {
//            if (name.startsWith("a")){
//                list2.add(name);
//            }
//        }
//        System.out.println(list2);
//        System.out.println("----------------------");
//
//
//        ArrayList<String> list3 = new ArrayList<>();
//        for (String name : list2) {
//            if (name.length() <= 3){
//                list3.add(name);
//            }
//        }
//        System.out.println(list3);

        list1.stream().filter(name->name.startsWith("a")).filter(name -> name.length()==3).forEach(name -> System.out.println(name));



    }
}

使用步骤:

1.获得一条stream流,并放入数据。2.使用中间方法对流进行操作。3.使用终结方法进行操作

获得流

1.单列集合 使用Collection中的默认方法 stream()

package Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class StreamDemo2 {

    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e","f");

        Stream<String> stream1 = list.stream();

//        stream1.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });

        stream1.forEach(s->System.out.println(s));




    }

}

2.双列集合 无法直接使用,需先转化为单列集合才可用

package Stream;

import java.util.HashMap;

public class StreamDemo3 {

    public static void main(String[] args) {

        HashMap<String,Integer> hm = new HashMap<>();

        hm.put("aaa",1);
        hm.put("bbb",2);
        hm.put("ccc",3);
        hm.put("ddd",4);

        //双列集合获取stream流方法:将键转化为单列集合
        hm.keySet().stream().forEach(s -> System.out.println(s));

        //也可以使用entryset,获得键值对的单列集合再使用
        hm.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));

    }

}

3.数组        数组使用stream方法,会调用Arrays工具类中的Stream

4.零散数据 使用stream.of()实现.这个方法的形参是一个可变参数,可以传递零散数据和数组。但是传入的数组必须是引用数据类型。如果数组是一个基本数据类型,会把整个数组当作一个元素放入stream流中,因此会输出一个地址值。

package Stream;

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamDemo4 {
    public static void main(String[] args) {

        int[] arr ={1,2,3,45,6,7,8,9};

        Arrays.stream(arr).forEach(s-> System.out.print(s));

        System.out.println();

        Stream.of(1,2,3,4,5).forEach(s-> System.out.print(s));
    }
}

Stream流中间方法

每个动作产生stream流只能使用一次,动作结束后会产生新的stream流,因此建议使用链式编程。

filiter()        过滤

limit()        获取前几个元素

skip()        跳过前几个元素

distinct()        元素去重

concat()        合并a和b两个流为一个

map()        转换流中的数据类型

package Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class StreamDemo5 {
    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"aaa","ccc","bbb","ddd","aaaaa","aa");

//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                //放回值为true,表示当前数据留下。为false则舍去
//                return s.startsWith("a");
//            }
//        }).forEach(s -> System.out.println(s));

        list1.stream().filter( s-> s.startsWith("a")).forEach(s -> System.out.println(s));

        System.out.println("==========================");
        //每个动作产生stream流只能使用一次,动作结束后会产生新的stream流,因此建议使用链式编程

        //limit获得前几个
        list1.stream().limit(3)
                .forEach(s -> System.out.println(s));

        System.out.println("==========================");
        list1.stream().skip(4)
                .forEach(s -> System.out.println(s));

        System.out.println("==========================");

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"aaa","aaa","aaa","aaa","ccc","bbb","ddd","aaaaa","aa");

        ArrayList<String> list3 = new ArrayList<>();
        Collections.addAll(list3,"nnn","mmm","ppp","qqq");

        //去重
        list2.stream().distinct().forEach(s -> System.out.println(s));//使用hashSet进行的数据去重.
        System.out.println("==========================");

        
        Stream.concat(list1.stream(),list3.stream()).forEach(s -> System.out.println(s));
        System.out.println("==========================");



    }
}

Stream流终结方法

forEach()        遍历

count()        统计

toArray()        收集流中数据到数组

collect()        收集流中数据到集合

package Stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.IntFunction;

public class StreamDemo6 {
    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"aaa","ccc","bbb","ddd","aaaaa","aa");


        list1.stream().forEach(s -> System.out.println(s));
        System.out.println("==============================");

        long count = list1.stream().count();
        System.out.println(count);
        System.out.println("==============================");

//        String[] array = list1.stream().toArray(new IntFunction<String[]>() {
//            @Override
//            public String[] apply(int value) {
//                return new String[value];
//            }
//        });

        String[] array = list1.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(array));


    }
}

方法引用

方法+引用。引用的条件:

1.引用处必须是函数式接口

2.被引用方法必须已经存在

3.被引用方法的形参和返回值需要跟抽象方法保持一致

4.被引用方法的功能要满足当前需求

import java.util.Arrays;
import java.util.Comparator;

public class FunctionDemo1 {
    public static void main(String[] args) {

        Integer[] arr = {2,3,5,6,1,4};

        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(arr));

        System.out.println("=============================");

        Arrays.sort(arr,(o1, o2) -> o2 - o1);
        System.out.println(Arrays.toString(arr));

        System.out.println("=============================");

        Arrays.sort(arr,FunctionDemo1::subtraction);//方法引用
        System.out.println(Arrays.toString(arr));

    }

    //被引用的方法可以是java中已经写好的方法,也可以来自第三方工具类
    public static int subtraction(int num1,int num2){
        return num2 - num1;
    }

}

方法引用的分类:

1.引用静态方法

格式:类名::静态方法        

package Function;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;

public class FunctionDemo2 {
    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2","3","4","5","6");

        list.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                int i = Integer.parseInt(s);
                return i;
            }
        }).forEach(s-> System.out.println(s));

        System.out.println("=======================");
        list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));




    }
}

2.引用成员方法

格式:对象::成员方法

(1)引用其他类的成员方法

                其他类::方法名

package Function;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

public class FunctionDemo3 {
    public static void main(String[] args) {

        ArrayList<String> list =new ArrayList<>();
        Collections.addAll(list,"aaa","ccc","bbb","ddd","aaaaa","aa");

        list.stream().filter(s -> s.startsWith("a"))
                .filter(s -> s.length()==3)
                .forEach(s -> System.out.println(s));

        System.out.println("==============================");

        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("a") && s.length() == 3;
            }
        }).forEach(s -> System.out.println(s));

        System.out.println("==============================");

        list.stream().filter(new StringOperation()::StringJudge)
                .forEach(s -> System.out.println(s));

    }
}
package Function;

public class StringOperation {
    public boolean StringJudge(String s){
        return s.startsWith("a") && s.length() == 3;
    }
}
(2)引用本类的成员方法

                this::方法名

(3)引用父类的成员方法

                super::方法名

3.引用构造方法

类名引用成员变量.  类名::成员方法。特殊规则:在stream流中,第一个参数表示流里的每个数据,假设流里的数据是字符串,那么都只能用String这个类里的方法。

接下来从第二个参数到第三个参数跟引用方法的形参保持一致,若没有第二个参数,说明被引用的方法需要无参的成员方法。

引用数组的构造方法   数据类型[]::new

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐