lambad表达式(3) 利用Stream对数据类型进行转换

1、Stream.map
其作用接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象,这个表示,调用这个函数后,可以改变返回的类型。
map方法的源码如下:

 /**
     *这个接口,接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象,这个表示,调用这个函数后,可以改变返回的类型
     */
    <R> Stream<R> map(Function<? super T, ? extends R> mapper);

使用实例(将一个Integer类型的转换为一个Stringl类型):

public class ConvertType {
    public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Stream.of(nums).map(intValue -> String.valueOf(intValue)).forEach( vo -> {
            System.out.println(vo);
            System.out.println(vo.getClass()); // class java.lang.String
        });
    }
}

从main方法执行的结果可以发现经过map的处理Stream中的对象已经从Integer --> String
要将其返回值类型也修改可以如下操作:

public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<String> list = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.toList());
    }

2、Stream.collect()方法

一转为字符串:

直接使用Stream对象的collect方法传入Collectors.joining()),其中joining方法是一个重载方法。
使用一、直接joining()不传任何参数如下:

public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String str = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.joining());
        System.out.println(str);  // "12345678910"
        System.out.println(str.getClass()); // class java.lang.String
    }

使用二、传入一个类型为CharSequence的 delimiter参数,其作用是,根据输入的delimiter参数按遇到的顺序由delimiter作为分隔符分隔
其源码如下:

 public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
        return joining(delimiter, "", "");
    }

具体使用如:

 public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String str = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.joining("-"));
        System.out.println(str);  // "1-2-3-4-5-6-7-8-9-10"
        System.out.println(str.getClass()); // class java.lang.String
    }

使用三:joining(CharSequence delimiter,CharSequence prefix, CharSequence suffix),根据传入的delimiter顺序的分隔符进行分隔,根据传入的prefix作为前缀拼接串,根据suffix作为后缀串进行拼接。
源码如下:

 public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                             CharSequence prefix,
                                                             CharSequence suffix) {
        return new CollectorImpl<>(
                () -> new StringJoiner(delimiter, prefix, suffix),
                StringJoiner::add, StringJoiner::merge,
                StringJoiner::toString, CH_NOID);
    }

具体使用如:

 public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String str = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.joining("-",
                "prefix", "suffix"));
        System.out.println(str);  // "prefix1-2-3-4-5-6-7-8-9-10suffix"
        System.out.println(str.getClass()); // class java.lang.String
    }

二:转为LIst
直接使用Stream对象的collect方法传入Collectors.toList())

public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<String> list = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.toList());
        list.forEach(str -> System.out.println(str));
    }

三:转为Set
直接使用Stream对象的collect方法传入Collectors.toSet())

public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Set<String> set = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.toSet());
        set.forEach(str -> System.out.println(str));
    }

*四:转为Map
*

直接使用Stream对象的collect方法传入Collectors.toSet())
简单的对象转map:.

public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Map<String, String> map = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.
                toMap(String::toString, String::toString));
        Iterator<String> iterator = map.values().iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

如何考虑到可能存在hash冲突问题可以引入mergefunction作为参数
mergefunction方法源码如下:

Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
  Function<? super T, ? extends U> valueMapper,
  BinaryOperator<U> mergeFunction)

其作用是一个合并函数,它指出在发生冲突的情况下,我们保留现有条目,
具体使用如下:

  public static void main(String[] args) {
        Integer[] nums = new Integer[]{1,1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Map<String, String> map = Stream.of(nums).map(intValue -> String.valueOf(intValue)).collect(Collectors.
                toMap(String::toString, Function.identity(), (existing, replacement) -> existing));
        Iterator<String> iterator = map.values().iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

复杂对象转map.
首先先准备一个java对象如下:

public class Student {
    
    private String name;
    
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

具体使用如(使用具体的成员变量为key 和value):

 public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        Map<String, Integer> map = students.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
    }

或者使用对象作为value:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        Map<String, Student> map = students.stream().collect(Collectors.toMap(Student::getName, Function.identity()));
        map.values().forEach(vo -> System.out.println(vo));
    }

或使用lambda表示设置key 和value:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        Map<String, Student> map = students.stream().collect(Collectors
                // 第一个参数为key.
                // 第二为value;
                // 第三个表示前后的key是相同,到是覆盖还是不覆盖,(s1,s2)-> s1表示不覆盖,(s1,s2)-> s2 表示覆盖。
                .toMap(s -> s.getName(), s -> s, (s1, s2) -> s1));
        map.values().forEach(vo -> System.out.println(vo));
        System.out.println(map instanceof TreeMap); // true
    }

默认情况下,tomap()方法将返回哈希映射。我们可以使用这个重载的toMap()方法,toMap方法可以将一个Stream对象转换成一个Map对象。源码如下:

Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
  Function<? super T, ? extends U> valueMapper,
  BinaryOperator<U> mergeFunction,
  Supplier<M> mapSupplier)

其中mapsupplier是返回带有结果的新空映射的函数。

返回一个ConcurrentHashMap

 public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        Map<String, Student> map = students.stream().collect(Collectors.toMap(Student::getName, Function.identity(),
                (o1,o2) -> o1, ConcurrentHashMap::new
                ));
        map.values().forEach(vo -> System.out.println(vo));
        System.out.println(map instanceof ConcurrentHashMap); // true
    }

返回一个TreeMap

 public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        Map<String, Student> map = students.stream().collect(Collectors.toMap(Student::getName, Function.identity(),
                (o1,o2) -> o1, TreeMap::new
                ));
        map.values().forEach(vo -> System.out.println(vo));
        System.out.println(map instanceof TreeMap); // true
    }

Collectors类的tomap()方法。它允许我们从流中创建一个新的映射

五 groupingBy方法
groupingBy是能够根据字段进行分组。
具体使用实例:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        // 根据学生姓名进行分组
        Map<String, List<Student>> map = students.stream().collect(Collectors.groupingBy(Student::getName));
        map.values().forEach(vo -> System.out.println(vo));
    }

或统计重名:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("user1", 18));
        students.add(new Student("user2", 26));
        students.add(new Student("user3", 30));
        students.add(new Student("user4", 10));
        students.add(new Student("user4", 10));
        // 统计年纪相同的学生
        Map<String, Set<String>> collect = students.stream().collect(Collectors.
                groupingBy(Student::getName, Collectors.mapping(Student::getName, Collectors.toSet())));
        collect.values().forEach(vo -> System.out.println(vo));
    }
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,可以使用 Stream API 进行数据的删除操作。具体步骤如下: 1. 将要删除的数据放入一个集合中,比如 List。 2. 将集合转换Stream,可以使用 `stream()` 方法。 3. 使用 `filter()` 方法过滤出不需要删除的数据,返回一个新的 Stream。 4. 如果需要将过滤后的数据重新组合成一个集合,可以使用 `collect()` 方法,比如 `Collectors.toList()`。 以下是一个示例代码: ```java List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); list.add("watermelon"); List<String> toDelete = Arrays.asList("apple", "orange"); List<String> result = list.stream() .filter(item -> !toDelete.contains(item)) .collect(Collectors.toList()); System.out.println(result); // 输出 [banana, watermelon] ``` 在这个示例中,我们首先将要删除的数据放入了一个集合 `toDelete` 中。然后使用 `filter()` 方法过滤出不需要删除的数据,最后使用 `collect()` 方法将过滤后的数据重新组合成一个集合。最终输出的结果是 `[banana, watermelon]`,符合预期。 ### 回答2: 在Java中,可以使用Stream来删除数据。Stream是Java 8中引入的一种用于对集合进行一系列操作的抽象。下面是一个示例,演示了如何使用Stream删除数据: 假设我们有一个存储了一些学生信息的List<Student>对象,现在需要删除年龄大于18岁的学生。可以按照以下步骤进行: 1. 导入必要的类: import java.util.List; import java.util.stream.Collectors; 2. 创建一个包含学生信息的List对象: List<Student> students = new ArrayList<>(); 3. 添加学生信息到List中: students.add(new Student("Tom", 15)); students.add(new Student("John", 20)); students.add(new Student("Lisa", 17)); students.add(new Student("Amy", 19)); 4. 使用Stream进行筛选和删除操作: List<Student> filteredStudents = students.stream() .filter(student -> student.getAge() <= 18) .collect(Collectors.toList()); 这里使用了filter()方法以及Lambda表达式来筛选出年龄小于等于18岁的学生,并将结果收集到一个新的List对象filteredStudents中。 5. 打印筛选后的学生信息: filteredStudents.forEach(student -> System.out.println(student.getName() + " : " + student.getAge())); 这样就可以遍历filteredStudents,并打印出学生的姓名和年龄。 通过使用Stream的filter()方法,结合Lambda表达式,可以轻松地筛选和删除集合中的数据。在上述示例中,我们通过filter()方法将筛选出年龄小于等于18岁的学生,并将结果存储在filteredStudents中。 ### 回答3: 在Java中使用Stream删除数据可以通过使用filter操作来完成。Stream提供了filter方法,该方法接受一个Predicate参数,用于定义删除规则。 首先,需要有一个包含数据的集合,比如List。假设有一个List<Integer> numbers,包含了一些整数。 然后,可以使用Stream的filter方法来创建一个新的Stream,其中仅包含满足删除条件的元素。例如,可以使用filter方法来删除所有大于10的元素: Stream<Integer> filteredStream = numbers.stream().filter(num -> num <= 10); 这里的filter操作使用了一个Lambda表达式,该表达式返回一个布尔值,表示元素是否需要被保留。在这个例子中,filter操作保留了所有小于等于10的元素,而删除了所有大于10的元素。 最后,可以将过滤后的Stream转换回原来的集合类型,以获取删除后的数据。比如,可以使用collect方法将Stream转换为List: List<Integer> filteredList = filteredStream.collect(Collectors.toList()); 综上所述,通过使用Stream的filter方法和collect方法,可以在Java中利用Stream删除数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值