Java8使用Stream流实现List列表的查询、统计、排序、分组

2023-05-16

Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。

下面是使用Stream的常用方法的综合实例。

创建User类作为持久层。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    int id;
    String name;
    String sex;
    int age;
    String Department;
    BigDecimal Salary;

}

创建UserService.class(用户信息业务逻辑类)。

package com.wsq;

import com.wsq.pojo.User;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/*
 * 用户信息业务逻辑类
 * @author wsq
 */
public class UserService {
    /*
     * 获取用户列表
     */
    public static List<User> getUserList() {
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "wsq的博客_01", "男", 32, "研发部", BigDecimal.valueOf(1600)));
        userList.add(new User(2, "wsq的博客_02", "男", 30, "财务部", BigDecimal.valueOf(1800)));
        userList.add(new User(3, "wsq的博客_03", "女", 20, "人事部", BigDecimal.valueOf(1700)));
        userList.add(new User(4, "wsq的博客_04", "男", 38, "研发部", BigDecimal.valueOf(1500)));
        userList.add(new User(5, "wsq的博客_05", "女", 25, "财务部", BigDecimal.valueOf(1200)));
        return userList;
    }
}

一、查询方法

1.1 forEach()

使用 forEach() 遍历列表数据。

/*
 * 使用forEach()遍历列表信息
 * @author wsq
 */
@Test
public void forEachTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //遍历用户列表
    System.out.println("---------------输出方法一-----------------");
    userList.forEach(user -> {System.out.println(user);});
    System.out.println("---------------输出方法二-----------------");
    userList.forEach(System.out::println);
}

控制台输出:


1.2 filter(T -> boolean)

使用 filter() 过滤列表数据。

【示例】获取部门为“研发部”的用户列表。

/*
 * 使用filter()过滤列表信息
 * @author wsq
 */
@Test
public void filterTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取部门为“研发部”的用户列表
    userList = userList.stream().filter(user -> user.getDepartment() == "研发部").collect(Collectors.toList());
 
    //遍历用户列表
    userList.forEach(System.out::println);
}

控制台输出:


1.3 findAny() 和 findFirst()

使用 findAny() 和 findFirst() 获取第一条数据。

【示例】获取用户名称为“wsq的博客_02”的用户信息,如果未找到则返回null。

/*
 * 使用findAny()获取第一条数据
 * @author wsq
 */
@Test
public void findAnytTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取用户名称为“pan_junbiao的博客_02”的用户信息,如果没有找到则返回null
    User user = userList.stream().filter(u -> u.getName().equals("wsq的博客_02")).findAny().orElse(null);
 
    //打印用户信息
    System.out.println(user);
}

控制台输出:

注意:findFirst() 和 findAny() 都是获取列表中的第一条数据,但是findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行(parallelStream并行流)的情况,那就不能确保是第一个。

例如:使用parallelStream并行流,findAny() 返回的就不一定是第一条数据。
 

//parallelStream方法能生成并行流,使用findAny返回的不一定是第一条数据
User user = userList.parallelStream().filter(u -> u.getName().startsWith("wsq")).findAny().orElse(null);

1.4 map(T -> R) 和 flatMap(T -> Stream)

使用 map() 将流中的每一个元素 T 映射为 R(类似类型转换)。

使用 flatMap() 将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。

【示例】使用 map() 方法获取用户列表中的名称列。

/*
 * 使用map()获取列元素
 * @author wsq
 */
@Test
public void mapTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取用户名称列表
    List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
    //或者:List<String> nameList = userList.stream().map(user -> user.getName()).collect(Collectors.toList());
 
    //遍历名称列表
    nameList.forEach(System.out::println);
}

控制台输出:

【示例】使用 flatMap() 将流中的每一个元素连接成为一个流。

/*
 * 使用flatMap()将流中的每一个元素连接成为一个流
 * @author wsq
 */
@Test
public void flatMapTest(){
    //创建城市
    List<String> cityList = new ArrayList<String>();
    cityList.add("北京;上海;深圳;");
    cityList.add("广州;武汉;杭州;");
 
    //分隔城市列表,使用 flatMap() 将流中的每一个元素连接成为一个流。
    cityList = cityList.stream()
            .map(city -> city.split(";"))
            .flatMap(Arrays::stream)
            .collect(Collectors.toList());
 
    //遍历城市列表
    cityList.forEach(System.out::println);
}

控制台输出:


1.5 distinct()

使用 distinct() 方法可以去除重复的数据。

【示例】获取部门列表,并去除重复数据。

/**
 * 使用distinct()去除重复数据
 * @author wsq
 */
@Test
public void distinctTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取部门列表,并去除重复数据
    List<String> departmentList = userList.stream().map(User::getDepartment).distinct().collect(Collectors.toList());
 
    //遍历部门列表
    departmentList.forEach(System.out::println);
}

控制台输出:


1.6 limit(long n) 和 skip(long n)

limit(long n) 方法用于返回前n条数据,skip(long n) 方法用于跳过前n条数据。

【示例】获取用户列表,要求跳过第1条数据后的前3条数据。

/*
 * limit(long n)方法用于返回前n条数据
 * skip(long n)方法用于跳过前n条数据
 * @author wsq
 */
@Test
public void limitAndSkipTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取用户列表,要求跳过第1条数据后的前3条数据
    userList = userList.stream()
            .skip(1)
            .limit(3)
            .collect(Collectors.toList());
 
    //遍历用户列表
    userList.forEach(System.out::println);
}

控制台输出:


二、判断方法

2.1 anyMatch(T -> boolean)

使用 anyMatch(T -> boolean) 判断流中是否有一个元素匹配给定的 T -> boolean 条件。

2.2 allMatch(T -> boolean)

使用 allMatch(T -> boolean) 判断流中是否所有元素都匹配给定的 T -> boolean 条件。

2.3 noneMatch(T -> boolean)

使用 noneMatch(T -> boolean) 流中是否没有元素匹配给定的 T -> boolean 条件。

【示例】使用 anyMatch()、allMatch()、noneMatch() 进行判断。
 

/*
 * 使用 anyMatch()、allMatch()、noneMatch() 进行判断
 * @author wsq
 */
@Test
public void matchTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //判断用户列表中是否存在名称为“pan_junbiao的博客_01”的数据
    boolean result1 = userList.stream().anyMatch(user -> user.getName().equals("pan_junbiao的博客_01"));
 
    //判断用户名称是否都包含“pan_junbiao的博客”字段
    boolean result2 = userList.stream().allMatch(user -> user.getName().contains("pan_junbiao的博客"));
 
    //判断用户名称是否存在不包含“pan_junbiao的博客”字段
    boolean result3 = userList.stream().noneMatch(user -> user.getName().contains("pan_junbiao的博客"));
 
    //打印结果
    System.out.println(result1);
    System.out.println(result2);
    System.out.println(result3);
}

控制台输出:


三、统计方法

3.1 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)

使用 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T) 用于组合流中的元素,如求和,求积,求最大值等。

【示例】使用 reduce() 求用户列表中年龄的最大值、最小值、总和。

/*
 * 使用 reduce() 方法
 * @author wsq
 */
@Test
public void reduceTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //用户列表中年龄的最大值、最小值、总和
    int maxVal = userList.stream().map(User::getAge).reduce(Integer::max).get();
    int minVal = userList.stream().map(User::getAge).reduce(Integer::min).get();
    int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);
    
    //打印结果
    System.out.println("最大年龄:" + maxVal);
    System.out.println("最小年龄:" + minVal);
    System.out.println("年龄总和:" + sumVal);
}

控制台输出:


3.2 mapToInt(T -> int) 、mapToDouble(T -> double) 、mapToLong(T -> long) 

int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);计算元素总和的方法其中暗含了装箱成本,map(User::getAge) 方法过后流变成了 Stream 类型,而每个 Integer 都要拆箱成一个原始类型再进行 sum 方法求和,这样大大影响了效率。针对这个问题 Java 8 有良心地引入了数值流 IntStream, DoubleStream, LongStream,这种流中的元素都是原始数据类型,分别是 int,double,long。

流转换为数值流:

  • mapToInt(T -> int) : return IntStream
  • mapToDouble(T -> double) : return DoubleStream
  • mapToLong(T -> long) : return LongStream

【示例】使用 mapToInt() 求用户列表中年龄的最大值、最小值、总和、平均值。
 

/*
 * 使用 mapToInt() 方法
 * @author wsq
 */
@Test
public void mapToIntTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //用户列表中年龄的最大值、最小值、总和、平均值
    int maxVal = userList.stream().mapToInt(User::getAge).max().getAsInt();
    int minVal = userList.stream().mapToInt(User::getAge).min().getAsInt();
    int sumVal = userList.stream().mapToInt(User::getAge).sum();
    double aveVal =  userList.stream().mapToInt(User::getAge).average().getAsDouble();
 
    //打印结果
    System.out.println("最大年龄:" + maxVal);
    System.out.println("最小年龄:" + minVal);
    System.out.println("年龄总和:" + sumVal);
    System.out.println("平均年龄:" + aveVal);
}

控制台输出:


3.3 counting() 和 count()

 使用 counting() 和 count() 可以对列表数据进行统计。

【示例】使用 count() 统计用户列表信息。

/*
 * 使用 counting() 或 count() 统计
 * @author wsq
 */
@Test
public void countTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //统计研发部的人数,使用 counting()方法进行统计
    Long departCount = userList.stream().filter(user -> user.getDepartment() == "研发部").collect(Collectors.counting());
 
    //统计30岁以上的人数,使用 count()方法进行统计(推荐)
    Long ageCount = userList.stream().filter(user -> user.getAge() >= 30).count();
 
    //统计薪资大于1500元的人数
    Long salaryCount = userList.stream().filter(user -> user.getSalary().compareTo(BigDecimal.valueOf(1500)) == 1).count();
 
    //打印结果
    System.out.println("研发部的人数:" + departCount + "人");
    System.out.println("30岁以上的人数:" + ageCount + "人");
    System.out.println("薪资大于1500元的人数:" + salaryCount + "人");
}

控制台输出:


3.4 summingInt()、summingLong()、summingDouble()

用于计算总和,需要一个函数参数。

/*
 * 使用 summingInt()、summingLong()、summingDouble()
 * @author wsq
 */
@Test
public void sumTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //计算年龄总和
    int sumAge = userList.stream().collect(Collectors.summingInt(User::getAge));

    //打印结果
    System.out.println("年龄总和:" + sumAge);
}

控制台输出:


3.5 averagingInt()、averagingLong()、averagingDouble()

用于计算平均值。

/*
 * 使用 summingInt()、summingLong()、summingDouble()
 * @author wsq
 */
@Test
public void sumTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //计算平均年龄
    double aveAge = userList.stream().collect(Collectors.averagingDouble(User::getAge));

    //打印结果
    System.out.println("平均年龄:" + aveAge);
}

控制台输出:


3.6 summarizingInt()、summarizingLong()、summarizingDouble()

这三个方法比较特殊,比如 summarizingInt 会返回 IntSummaryStatistics 类型。

IntSummaryStatistics类提供了用于计算的平均值、总数、最大值、最小值、总和等方法,方法如下图:

【示例】使用 IntSummaryStatistics 统计:最大值、最小值、总和、平均值、总数。

/*
 * 使用 summarizingInt 统计
 * @author wsq
 */
@Test
public void summarizingIntTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //获取IntSummaryStatistics对象
    IntSummaryStatistics ageStatistics = userList.stream().collect(Collectors.summarizingInt(User::getAge));
 
    //统计:最大值、最小值、总和、平均值、总数
    System.out.println("最大年龄:" + ageStatistics.getMax());
    System.out.println("最小年龄:" + ageStatistics.getMin());
    System.out.println("年龄总和:" + ageStatistics.getSum());
    System.out.println("平均年龄:" + ageStatistics.getAverage());
    System.out.println("员工总数:" + ageStatistics.getCount());
}

控制台输出:


3.7 BigDecimal类型的统计

对于资金相关的字段,通常会使用BigDecimal数据类型。

【示例】统计用户薪资信息。

/*
 * BigDecimal类型的统计
 * @author wsq
 */
@Test
public void BigDecimalTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //最高薪资
    BigDecimal maxSalary = userList.stream().map(User::getSalary).max((x1, x2) -> x1.compareTo(x2)).get();
 
    //最低薪资
    BigDecimal minSalary = userList.stream().map(User::getSalary).min((x1, x2) -> x1.compareTo(x2)).get();
 
    //薪资总和
    BigDecimal sumSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
 
    //平均薪资
    BigDecimal avgSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(userList.size()), 2, BigDecimal.ROUND_HALF_UP);
 
    //打印统计结果
    System.out.println("最高薪资:" + maxSalary + "元");
    System.out.println("最低薪资:" + minSalary + "元");
    System.out.println("薪资总和:" + sumSalary + "元");
    System.out.println("平均薪资:" + avgSalary + "元");
}

控制台输出:


四、排序方法

4.1 sorted() / sorted((T, T) -> int)

如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如 Stream。反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口。

【示例】根据用户年龄进行排序。
 

/*
 * 使用 sorted() 排序
 * @author wsq
 */
@Test
public void sortedTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //根据年龄排序(升序)
    userList = userList.stream().sorted((u1, u2) -> u1.getAge() - u2.getAge()).collect(Collectors.toList());
    //推荐:userList = userList.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());
    //降序:userList = userList.stream().sorted(Comparator.comparingInt(User::getAge).reversed()).collect(Collectors.toList());
 
    //遍历用户列表
    userList.forEach(System.out::println);
}

控制台输出:


五、分组方法

5.1 groupingBy

使用 groupingBy() 将数据进行分组,最终返回一个 Map 类型。

【示例】根据部门对用户列表进行分组。

/*
 * 使用 groupingBy() 分组
 * @author wsq
 */
@Test
public void groupingByTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //根据部门对用户列表进行分组
    Map<String,List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment));
 
    //遍历分组后的结果
    userMap.forEach((key, value) -> {
        System.out.println(key + ":");
        value.forEach(System.out::println);
        System.out.println("---------------------------------------------");
    });
}

控制台输出:


5.2 多级分组

groupingBy 可以接受一个第二参数实现多级分组。

【示例】根据部门和性别对用户列表进行分组。

/*
 * 使用 groupingBy() 多级分组
 * @author wsq
 */
@Test
public void multGroupingByTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //根据部门和性别对用户列表进行分组
    Map<String,Map<String,List<User>>> userMap = userList.stream()
            .collect(Collectors.groupingBy(User::getDepartment,Collectors.groupingBy(User::getSex)));
 
    //遍历分组后的结果
    userMap.forEach((key1, map) -> {
        System.out.println(key1 + ":");
        map.forEach((key2,user)->
        {
            System.out.println(key2 + ":");
            user.forEach(System.out::println);
        });
        System.out.println("-------------------------------------------------------");
    });
}

控制台输出:


5.3 分组汇总

【示例】根据部门进行分组,汇总各个部门用户的平均年龄。

/*
 * 使用 groupingBy() 分组汇总
 * @author wsq
 */
@Test
public void groupCollectTest(){
    //获取用户列表
    List<User> userList = UserService.getUserList();
 
    //根据部门进行分组,汇总各个部门用户的平均年龄
    Map<String, Double> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment, Collectors.averagingInt(User::getAge)));
 
    //遍历分组后的结果
    userMap.forEach((key, value) -> {
        System.out.println(key + "的平均年龄:" + value);
    });
}

控制台输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8使用Stream流实现List列表的查询、统计、排序、分组 的相关文章

  • 日常问题:解决nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found问题

    今天在调试上周编写好得代码程序的时候 xff0c 在执行到mybatis获取某行数据转换成自定义的类型时 xff0c 抛出了异常 xff1a nested exception is org apache ibatis executor Ex
  • Abort message: ‘FORTIFY: FD_SET: file descriptor 1070 >= FD_SETSIZE 128‘

    问题现象 压力测试骁龙相机 xff0c 发现camera provicer 进程崩溃 无法正常打开相机 xff0c 只有重新启动设备 相关的log xff1a 03 23 08 17 08 592 15634 15634 F DEBUG s
  • 滚动校验(Rolling Checksum)算法

    滚动校验 Rolling Checksum 算法 Rsync中使用了一种滚动检验 Rolling Checksum 算法 xff0c 用于快速计算数据块的检验值 它是一种弱校验算法 xff0c 采用的是Mark Adler的adler 32
  • Android GMS认证总结01

    测试项 失败项 备注 GTS com google android media gts WidevineYouTubePerformanceTests testL3Cenc720P30 pass com google android per
  • ZYNQ 在linux 通过AXI_GPIO操作电平

    在petalinux 通过AXI GPIO操作电平 以zynq为例 xff0c vivado工程 xff1a axi gpio n都是选择的一位输出 xff1a 管脚约束 xff1a set property SEVERITY Warnin
  • FSK,PSK,ASK,BPSK调制

    信号调制常用的三种基本方法是 xff1a 调幅 调频和调相 1 振幅调变 xff0c 简称为调zhi幅 xff0c 通过改变输出dao信号的振幅 xff0c 来实现传送信息的目的 一般在调制端输出的高频信号的幅度变化与原始信号成一定的函数关
  • ZYNQ移植vxworks系统

    版本 xff1a ZYNQ7010 xff0c VxWorks 6 9 ZYNQ PL端有灵活性好 xff0c 资源丰富 xff0c 可反复编程速度快的优势 xff0c 通过 PS的外设并行 AXI总线外挂 PL接口 xff0c 使用 FP
  • OpenCV-Python 3.X: cv2.xfeatures2d 无法使用问题解决

    由于专利的问题surf和sift特征已经被移到xfeatures2d里面 xff0c 这个模块需要安装opencv contrib python opencv的dnn模块可以加载深度学习模型 xff0c 但是dnn需要3 4以上 xff0c
  • 旧款Mac开启随航(sideCar)功能

    看到这个标题 不得不吐槽苹果 命名软硬件都可以支持 但是故意让旧设备不支持这个功能 真是鸡贼 吐槽完毕 本文参考博客 http dev zeppel eu luca SidecarCorePatch 里面是英文版的 所以我总结翻译以下几点
  • Masonry框架源码分析

    相信大多数iOS开发者对Masonry框架并不陌生 本文是笔者通读Masonry的代码之后的一篇总结 也希望可以帮助大家更好的理解该框架 怎奈笔者才疏学浅 如有遗漏或错误也欢迎大家评论区指出 大家一起进步 iOS布局的演进 在说Masonr
  • iOS面试题总结-未完待续

    iOS面试总结 1 网络 HTTP协议 HyperText Transfer Protocol 的请求和响应 请求 请求头 请求行 请求体 请求行 指定请求方法 请求路径 协议版本等信息请求头 描述客户端环境 例如 host要请求的主机地址
  • Mac本地生成SSH Key 的方法

    1 查看秘钥是否存在 打开终端查看是否已经存在SSH密钥 xff1a cd ssh 如果没有密钥则不会有此文件夹 xff0c 有则备份删除 也可以直接删除 2 生成新的秘钥 命令如下 ssh keygen t rsa C 34 yourem
  • Charles网络抓包工具使用教程

    1 前言 xff1a Charles是一款抓包修改工具 xff0c 相比起burp xff0c charles具有界面简单直观 xff0c 易于上手 xff0c 数据请求控制容易 xff0c 修改简单 xff0c 抓取数据的开始暂停方便等等
  • 开源许可证

  • CocoaPods如何指定版本号

    一个简单的podfile pod 39 AFNetworking 39 39 gt 1 0 39 版本号可以是1 0 xff0c 可以是1 1 xff0c 1 9 xff0c 但必须小于2 一个更简单的podfile pod 39 AFNe
  • ipa包上传itunes store失败

    昨天打包上传ipa包 遇到了故障 开始以为是网络问题 但是切换了各种网络之后发现这个不是网络问题 我推测应该是苹果在mac上更新了什么东西 换用application Loader 工具上传还是不行 但是比Xcode直接上传的好处是 可以看
  • Flutter 安装 (Mac环境)

    Flutter 安装 今天偶然看到一个公众号写了一篇关于Flutter 的文章 感觉挺好 所以就来尝试一下 整个安装过程挺简单 但也不是特别顺利 因为我自己使用的是Mac系统所以这里所有操作都是Mac系统下的操作 安装Flutter SDK
  • 删除桌面上出现无文件名图标的方法

    问题现象 xff1a 桌面上出现了无文件名及后缀的图标 xff0c 当用户是管理员模式时看不到 xff0c 当用户为user权限下能看的得见 xff08 其他权限下没试 xff09 处理方法 xff1a 1 桌面上右击 属性 桌面 自定义桌
  • Hadoop之MapReduce

    摘要 xff1a MapReduce是Hadoop的又一核心模块 xff0c 从MapReduce是什么 xff0c MapReduce能做什么以及MapReduce的工作机制三方面认识MapReduce 关键词 xff1a Hadoop
  • Linux常用命令

    摘要 xff1a 采用命令行模式操控Linux系统非常重要 本文总结Linux常用的命令 xff0c 包括命令的含义 xff0c 命令的用法以及命令的拓展 关键词 xff1a 命令行模式 Linux常用命令 给Linux系统下达命令 xff

随机推荐

  • Hadoop之HDFS文件操作

    摘要 xff1a Hadoop之HDFS文件操作常有两种方式 xff0c 命令行方式和JavaAPI方式 本文介绍如何利用这两种方式对HDFS文件进行操作 关键词 xff1a HDFS文件 命令行 Java API HDFS是一种分布式文件
  • R实战读书笔记四

    第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号 线 颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括如下 一图胜千字 xff0c 人们从视觉层更易获取和理解信息 图形工作 R具有非常强大的绘
  • R语言——数据分析的一把利剑

    R语言 xff0c 我把它称之为数据分析的一把利剑 为什么这么说呢 xff1f 先让我们看一下 xff0c 什么是数据分析 xff1f 所谓数据分析 xff0c 就是以商业目的为驱动 xff0c 所开展的获取数据 处理数据 分析数据 展示数
  • 【爱上Linux】第一课 Linux概述

    学习应该是快乐的事情 快乐的东西应该要分享开来 xff0c 人人都快乐 xff01 爱上Linux 第一课 Linux概述 在本课中 xff0c 和朋友们一起来思考这些问题 问题一 xff1a 谈Linux学习 xff1f 从四个方面来看
  • Android日志框架SLF4J Android

    Android日志框架SLF4J 步骤 xff1a xff08 1 xff09 加入所需要的的jar包slf4j android 1 6 1 RC1 jar xff08 2 xff09 用法 private static final Log
  • 链表的创建与遍历

    链表 xff0c 简而言之 xff0c 就是基于链式储存结构下的线性表 链表包括单向链表 双向链表以及循环链表 链表是一种很常用的数据结构 xff0c 其定义如下 xff1a 单向链表的定义 定义说明 xff1a 包括数据域和指针域 typ
  • Java异常机制

    Java异常 xff08 Exception xff09 又称例外 xff0c 是一种运行时错误 Java异常机制就是对于Java异常的处理方法 xff0c 使用Java异常机制能提升程序的容错性 xff0c 从而使程序更加健壮与安全 ja
  • Java序列化与反序列化

    Java序列化与反序列化是什么 xff1f 为什么需要序列化与反序列化 xff1f 如何实现Java序列化与反序列化 xff1f 本文围绕这些问题进行了探讨 1 Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程
  • Java语言中几个常用的包

    Java采用包结构来组织和管理类和接口文件 本文介绍Java语言类库中几个常用的包 xff0c 因为这几个包在软件开发与应用中经常需要用到 xff0c 其中有些包是必要的 若是离开它 xff0c 还真不能做事情了 第一个包 xff1a ja
  • Android的系统架构

    Android的系统架构采用了分层架构的思想 xff0c 如图1所示 从上层到底层共包括四层 xff0c 分别是应用程序程序层 应用框架层 系统库和Android运行时和Linux内核 图1 xff1a Android系统架构图 每层功能简
  • Java中 判断String 是否为空的几种方法(null 、== 、equals)

    一 基本知识 String str1 61 null str1引用为空 xff0c 它没有地址 xff0c 它是一个没有被实例化的对象 String str2 61 34 34 str2引用为空字符串 xff0c 它有地址 xff0c 它是
  • C_INCLUDES must be under the source or output directories:

    https blog csdn net cigogo article details 94546032 参考了上面大神的链接 xff0c 发现设置了绝对路径 xff0c 改为相对路径后 xff0c 正常 编译报错 xff1a LOCAL P
  • Failed to connect to raw.githubusercontent.com port 443

    Mac 安装 homebrew xff1a 1 usr bin ruby e 34 curl fsSL https raw githubusercontent com Homebrew install master install 34 报
  • NFS配置及使用

    什么是NFS NFS Network File System 即网络文件系统 xff0c 是FreeBSD支持的文件系统中的一种 xff0c 它允许网络中的计算机之间通过TCP IP网络共享存储 在NFS的应用中 xff0c 本地NFS的客
  • 在idea中配置maven(阿里云镜像)

    1 下载maven 要使用maven当然要去下载 xff0c 可以去官网下载 xff0c 去官网下载需要自己配置 xff0c 这里可以使用我配置好的maven xff1b 链接 xff1a https pan baidu com s 1Zn
  • MTK6582资料帖和问题帖集合

    MTK6582资料帖汇总 Driver All in One V1 0 MT6572 MT6582 AOSP 发给需要的 MT6582memorydevicelist MT6582完整版DATASHEET xff0c xff1e 50M x
  • MYSQL笔记1

    MYSQL笔记 参照 MySQL数据库原理 设计与应用 清华大学出版社 第二章 数据库基本操作 2 1数据库操作 2 1 1创建数据库 create database if not exists xxx 2 1 2查看数据库 1 查看存在的
  • JetBrains学生认证

    1 首先找到JetBrains官网 JetBrains官网链接 2 找到学生申请页面 学生申请页面链接 3 选择申请方式 xff1a 官方文件 选择方式一共有四种 xff0c 较简单的是其中两种 xff0c 分别是大学电子邮箱地址和官方文件
  • Ubuntun18.04下载微信

    1 下载Wine环境包 xff1a http archive ubuntukylin com software pool partner ukylin wine 70 6 3 25 amd64 deb 2 下载微信 xff08 wine x
  • Java8使用Stream流实现List列表的查询、统计、排序、分组

    Java8提供了Stream xff08 流 xff09 处理集合的关键抽象概念 xff0c 它可以对集合进行操作 xff0c 可以执行非常复杂的查找 过滤和映射数据等操作 Stream API 借助于同样新出现的Lambda表达式 xff