Java 8 中Stream流的基本概念和用法介绍

1. 理解Java 8中Stream流的概念

Java 8中引入的Stream流是对集合对象进行各种操作的高级抽象,可以让开发者更加便捷、高效地处理数据。在本章节中,我们将深入探讨Java 8中Stream流的基本概念,包括Stream流的定义、与集合的关系以及使用Stream流的优势等内容。

1.1 什么是Stream流

1.1.1 Stream流的定义

Stream流可以被看作一种高级迭代器,它可以让开发者以一种声明性的方式处理数据,而不是传统的命令式迭代。通过对Stream流的操作,可以实现对数据的筛选、转换、聚合等功能。

1.1.2 Stream流与集合的关系

Stream流并不是数据结构,它不保存数据,而是从源数据(如集合、数组)中获取数据进行处理。Stream操作可以是中间操作(Intermediate Operation)也可以是终端操作(Terminal Operation)。

1.2 为什么要使用Stream流

1.2.1 提高代码可读性

Stream流采用链式操作的方式,可以让代码更具表现力和可读性,减少了传统循环操作带来的临时变量和过多的循环语句。

1.2.2 并行处理能力

Stream流天然支持并行处理,开发者无需关心底层的线程维护,只需要简单地使用parallel()方法就能实现流的并行处理。

1.3 Stream流的基本特性

1.3.1 懒惰求值

Stream流采用延迟计算的策略,只有在终端操作被调用时才会真正开始流的处理。这种懒加载的特性可以在一定程度上提高性能。

1.3.2 内部迭代

Stream流中的数据遍历和操作是由Stream内部完成的,开发者只需要关心对数据的处理逻辑,而不需要手动实现迭代逻辑。

通过对Java 8中Stream流的概念的理解,我们可以更好地利用Stream流来简化代码、提高效率。接下来,我们将深入探讨Stream流的创建与操作方式。

2. Stream流的创建与操作

在Java 8中,Stream流可以帮助我们更加简洁高效地处理集合数据。本章节将深入探讨如何创建Stream流以及常见的操作方法,包括中间操作和终端操作。

  1. 创建Stream流

    在Java 8中,我们可以通过不同的方式来创建Stream流,例如从集合和数组中创建。

    • 从集合创建Stream流

      从现有的集合中创建Stream流是最常见的方式之一。我们可以通过集合对象的stream()方法获取一个Stream对象。

      List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 从List集合创建Stream流
      Stream<String> stream = names.stream();
      
    • 从数组创建Stream流

      除了从集合中创建,我们还可以直接从数组中创建Stream流。通过Arrays.stream(T[] array)方法可以将数组转换为Stream流。

      String[] colors = {"Red", "Green", "Blue", "Yellow"};// 从数组创建Stream流
      Stream<String> colorStream = Arrays.stream(colors);
      
  2. 中间操作

    中间操作是Stream流中一系列操作的过程,用于对元素进行筛选、映射、排序等处理。

    • 过滤与映射操作

      通过filter()方法可以过滤符合特定条件的元素,而map()方法可以将流中的每个元素映射到另一个值。

      // 过滤长度大于4的字符串
      Stream<String> filteredStream = names.stream().filter(name -> name.length() > 4);// 将元素转换为大写形式
      Stream<String> upperCaseStream = names.stream().map(String::toUpperCase);
      
    • 排序与去重操作

      使用sorted()方法可以对流中的元素进行排序,在需要去重的情况下可以使用distinct()方法。

      // 对元素进行自然排序
      Stream<String> sortedStream = names.stream().sorted();// 去除重复元素
      Stream<String> distinctStream = names.stream().distinct();
      
  3. 终端操作

    终端操作是对Stream流的最终操作,会触发Stream流的执行并产生最终结果。

    • 收集操作

      通过collect()方法可以将Stream流的元素收集到一个集合中,如List、Set或Map。

      // 将元素收集到List中
      List<String> collectedList = names.stream().collect(Collectors.toList());// 将元素收集到Set中
      Set<String> collectedSet = names.stream().collect(Collectors.toSet());
      
    • 聚合操作

      聚合操作是对元素进行归约,如求和、求平均值等操作。我们可以使用reduce()方法进行聚合操作。

      // 求所有字符串的长度之和
      int totalLength = names.stream().mapToInt(String::length).reduce(0, Integer::sum);// 求字符串长度的平均值
      OptionalDouble averageLength = names.stream().mapToInt(String::length).average();
      

通过上述示例,我们可以看到在Java 8中使用Stream流进行数据处理非常高效便捷。接下来我们将详细介绍Stream流的常见操作示例。

开始
中间操作1
中间操作2
终端操作
结束

在流程图中,我们展示了一个简单的Stream流处理过程,从开始到结束经过了中间操作和终端操作的过程。这种流程图可以帮助我们更好地理解Stream流的操作流程。

这是本章节关于Stream流创建与操作的具体内容,接下来我们将深入讨论Stream流的常见操作示例。

3. Stream流的常见操作示例

在本章节中,我们将介绍Stream流的常见操作示例,包括筛选、转换、组合等操作,通过具体的示例来演示Stream流的灵活应用。

3.1 Stream流的筛选

在这一节中,我们将展示如何使用Stream流进行筛选操作,包括对数据进行过滤和截取操作。

  1. 过滤符合条件的数据

    下面的示例演示了如何使用Stream流对数据进行筛选,只保留符合特定条件的元素:

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> evenNumbers = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());System.out.println("Even numbers: " + evenNumbers);
    

    代码说明

    • 首先,我们创建一个包含整数的列表。
    • 然后使用stream()方法将列表转换为Stream流。
    • 调用filter()方法传入断言条件,只保留满足条件的偶数。
    • 最后使用collect(Collectors.toList())方法将结果收集到列表中并输出。

    结果说明
    输出结果为:Even numbers: [2, 4, 6, 8, 10],表示成功过滤出了所有的偶数。

  2. 截取前n个元素

    下面的示例演示了如何使用Stream流对数据进行截取操作,只选择前n个元素:

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> firstThreeNumbers = numbers.stream().limit(3).collect(Collectors.toList());System.out.println("First three numbers: " + firstThreeNumbers);
    

    代码说明

    • 仍然是先创建整数列表。
    • 使用limit(3)方法限制只取前三个元素。
    • 最后将结果收集到列表并输出。

    结果说明
    输出结果为:First three numbers: [1, 2, 3],表示成功截取出了前三个元素。

3.2 Stream流的转换

转换是Stream流操作中常见的一种操作,将数据转换为不同形式或进行相应的处理。

  1. 将数据转换为其他形式

    下面的示例演示了如何使用Stream流将整数列表转换为字符串列表:

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<String> numberStrings = numbers.stream().map(num -> "Number " + num).collect(Collectors.toList());System.out.println("Number strings: " + numberStrings);
    

    代码说明

    • 创建整数列表。
    • 使用map()方法将整数转换为带有前缀"Number"的字符串。
    • 最后将转换后的字符串列表输出。

    结果说明
    输出结果为:Number strings: [Number 1, Number 2, Number 3, Number 4, Number 5],成功将整数列表转换为字符串列表。

  2. 将大写转换为小写

    下面的示例演示了如何使用Stream流将字符串列表中的大写字符转换为小写:

    List<String> words = Arrays.asList("HELLO", "WORLD", "JAVA");List<String> lowerCaseWords = words.stream().map(String::toLowerCase).collect(Collectors.toList());System.out.println("Lowercase words: " + lowerCaseWords);
    

    代码说明

    • 创建包含大写字符串的列表。
    • 使用map(String::toLowerCase)方法将字符串转换为小写形式。
    • 最后将转换后的小写字符串列表输出。

    结果说明
    输出结果为:Lowercase words: [hello, world, java],成功将大写字符串转换为小写形式。

通过以上示例,我们演示了Stream流常见的筛选和转换操作,展示了Stream流的便捷和灵活性。接下来,我们将继续介绍Stream流的组合操作。

开始
过滤数据
转换数据
组合数据
结束

在Stream流的组合操作中,我们将展示如何将多个Stream流进行合并并进行多条件分组统计的操作。

4. Stream流的并行处理

在本章节中,我们将深入探讨Java 8中Stream流的并行处理,这是Stream流一个重要的特性,能够有效提高数据处理的效率。我们将先介绍并行流的优势和适用场景,然后讨论在使用并行流时需要注意的事项。

4.1 并行流的优势与适用场景

并行流是Stream API中的一种特殊流,可以让数据并行处理,充分利用多核处理器的计算资源,提高处理效率。下面是并行流的几个优势和适用场景:

序号优势与适用场景
1提高处理效率:适用于大数据量处理
2并行处理:适用于需要并行处理的场景
4.1.1 提高处理效率

并行流的一个主要优势就是可以加速大规模数据集的处理。通过并行处理,Stream API可以将数据集合拆分成多个小部分,分配给多个处理器核心并行处理,最后将结果合并返回。这种并行处理方式可以大幅提升处理速度,特别适用于处理需要耗费大量计算资源和时间的场景。

4.1.2 大数据集处理

在需要处理大数据集时,可以考虑使用并行流来提高处理速度。并行流能够有效地拆分数据块并并行处理,充分利用计算资源,提高处理效率。适用于大规模数据处理、搜索、排序等场景。

4.2 并行流的注意事项

在使用并行流时,需要特别注意一些事项,确保并行处理的顺利进行和结果的准确性,下面是一些常见的注意事项:

序号注意事项
1线程安全性:确保并行操作时的线程安全
2性能调优技巧:注意并行流的性能调优和资源使用
4.2.1 线程安全性

并行流操作涉及多线程处理,需要确保线程安全性。在对共享变量进行操作时,需要考虑线程安全问题,避免产生并发访问的异常情况。可以通过使用并发工具或同步机制来保证线程安全性。

4.2.2 性能调优技巧

为了提升并行流的处理性能,可以使用一些性能调优技巧。例如合理设置并行流的大小、调整线程池大小、避免过度并行等。这些技巧可以帮助我们更好地利用计算资源,提高并行处理的效率。

示例代码

下面是一个简单的Java示例代码,演示了如何使用并行流来处理大量数据:

import java.util.stream.IntStream;public class ParallelStreamExample {public static void main(String[] args) {// 生成一个包含1000个整数的StreamIntStream intStream = IntStream.range(0, 1000);// 使用并行流进行数据处理long count = intStream.parallel().filter(num -> num % 2 == 0).count();System.out.println("偶数个数:" + count);}
}

在上面的代码中,我们首先生成了一个包含1000个整数的Stream,然后通过并行流进行数据处理,筛选出所有偶数并统计个数。最后输出结果。通过并行流的方式,可以有效提高大数据集的处理效率。

流程图

下面是一个mermaid格式的流程图,展示了并行流的处理流程:

开始
数据处理
拆分数据
拆分数据
处理数据
合并结果
结束

上面的流程图展示了并行流处理数据的流程:首先将数据拆分成多个部分,然后并行处理各个部分,最后将结果合并返回,完成整个数据处理过程。

通过以上示例代码和流程图,我们可以更好地理解并行流的优势、注意事项和工作原理。在实际开发中,根据具体场景选择合适的流处理方式,可以提高代码效率和性能。

5. Stream流的异常处理与实用技巧

在实际开发中,对于Stream流的异常处理和一些实用技巧的掌握至关重要。本章节将介绍如何处理Stream流中的异常以及一些实用技巧。

5.1 异常处理

在处理Stream流时,有时候会遇到异常情况,例如空指针异常等。这里将介绍如何处理这些异常情况。

5.1.1 Stream流异常的处理方式

当Stream流中出现异常时,可以通过 try-catch 块来捕获并处理异常。下面是一个示例,演示如何处理Stream流中的空指针异常:

import java.util.Arrays;
import java.util.List;public class StreamExceptionHandling {public static void main(String[] args) {List<String> strings = Arrays.asList("apple", "banana", null, "orange");strings.stream().map(String::toUpperCase).forEach(str -> {try {System.out.println(str.length());} catch (NullPointerException e) {System.out.println("An exception occurred: " + e.getMessage());}});}
}

在上面的代码中,我们通过 try-catch 块捕获空指针异常,避免程序因异常而中断。

5.1.2 使用Optional避免空指针异常

为了更加优雅地处理空指针异常,可以使用Java 8中引入的 Optional 类。下面是一个示例,展示如何使用 Optional 避免空指针异常:

import java.util.Optional;public class OptionalExample {public static void main(String[] args) {String str = null;Optional<String> optionalStr = Optional.ofNullable(str);String result = optionalStr.orElse("Default Value");System.out.println("Result: " + result);}
}

在上面的代码中,我们使用 Optional.ofNullable 方法来包装可能为空的对象,然后通过 orElse 方法指定默认值,从而避免空指针异常。

5.2 实用技巧

除了异常处理外,还有一些实用技巧可以帮助优化Stream流的使用体验。下面将介绍一些实用技巧。

5.2.1 Stream流的性能优化技巧

在使用Stream流时,可以通过一些技巧来提升性能。例如,避免不必要的中间操作,尽量减少Stream的操作链等。下面是一个性能优化的示例:

import java.util.Arrays;
import java.util.List;public class StreamPerformanceOptimization {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().filter(num -> num % 2 == 0).mapToInt(Integer::intValue).sum();System.out.println("Sum of even numbers: " + sum);}
}

在上面的代码中,我们尽量减少了中间操作,直接对偶数进行求和操作,以提升性能。

5.2.2 避免不必要的中间操作

另一个实用技巧是避免不必要的中间操作,只保留必要的操作链。这样可以减少Stream的处理步骤,提高效率。下面是一个示例:

import java.util.Arrays;
import java.util.List;public class AvoidUnnecessaryOperations {public static void main(String[] args) {List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date");String result = fruits.stream().filter(fruit -> fruit.startsWith("a")).findFirst().orElse(null);System.out.println("Result: " + result);}
}

在上面的示例中,我们仅保留了必要的 filterfindFirst 操作,避免不必要的中间操作,提高了代码效率。

结语

通过以上介绍,我们深入探讨了Stream流的异常处理和一些实用技巧,希望能够帮助您在实际开发中更好地应用Stream流。下面,将重点讲解Stream流与函数式编程的结合。

6. Stream流与函数式编程

函数式编程在Java 8中得到了很好的支持,其中Stream流的使用是函数式编程的重要组成部分。本章节将深入探讨Stream流与函数式编程的结合,介绍函数式接口与Lambda表达式的概念,以及如何利用函数式接口和Lambda表达式来操作Stream流。

6.1 函数式接口与Lambda表达式
6.1.1 函数式接口的定义

在Java中,函数式接口是指只包含一个抽象方法的接口。函数式接口可以使用@FunctionalInterface注解标记,确保接口中只有一个抽象方法。

下表列出了一些常用的函数式接口:

接口描述参数类型返回类型
Runnable表示无参数无返回值的操作
Supplier表示一个供给型操作T
Consumer表示一个消费型操作T
Function<T, R>表示一个转换型操作TR
Predicate表示一个判断型操作Tboolean
6.1.2 Lambda表达式的使用

Lambda表达式是一种能够将函数作为方法的参数传递的一种简洁方式。Lambda表达式可以用来表示函数式接口的实例,从而简化函数式接口的使用。

下面是一个Lambda表达式的实例,使用Function函数式接口进行数据转换:

import java.util.function.Function;public class LambdaExample {public static void main(String[] args) {Function<Integer, String> convert = x -> String.valueOf(x);String result = convert.apply(10);System.out.println(result); // Output: "10"}
}

在上面的例子中,Lambda表达式x -> String.valueOf(x)接收一个整数参数并返回其字符串表示。

6.2 Stream流与函数式接口的结合

Stream流和函数式接口的结合能够提高代码的简洁性和可读性,下面将介绍如何使用函数式接口来操作Stream流。

6.2.1 使用Predicate进行条件过滤

Predicate是一个常用的函数式接口,可以用来对元素进行条件过滤。下面的示例演示了如何使用Predicate来过滤出大于10的元素:

import java.util.stream.Stream;
import java.util.function.Predicate;public class PredicateExample {public static void main(String[] args) {Stream<Integer> stream = Stream.of(5, 10, 15, 20);Predicate<Integer> condition = x -> x > 10;stream.filter(condition).forEach(System.out::println);// Output: 15, 20}
}

在上面的代码中,我们使用filter方法结合Predicate接口来过滤出大于10的元素,并输出结果。

6.2.2 使用Function进行数据转换

Function函数式接口可以用来对流中的元素进行转换操作。下面的示例展示了如何使用Function来将字符串转换为大写:

import java.util.stream.Stream;
import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {Stream<String> stream = Stream.of("apple", "banana", "cherry");Function<String, String> toUpperCase = String::toUpperCase;stream.map(toUpperCase).forEach(System.out::println);// Output: "APPLE", "BANANA", "CHERRY"}
}

以上代码使用map方法和Function函数式接口将流中的字符串转换为大写形式,并输出结果。

Mermaid流程图示例

下面以Mermaid格式展示一个简单的流程图,展示Lambda表达式的使用:

定义Lambda表达式
使用Lambda表达式

在以上流程图中,A节点表示定义Lambda表达式,B节点表示使用Lambda表达式。

通过函数式接口和Lambda表达式的结合,我们可以更加灵活地操作Stream流,提高代码的简洁性和可读性。在实际开发中,充分利用函数式编程的特性可以使代码更加优雅和高效。

7. 自定义Stream流操作**

在本章中,我们将深入探讨如何实现自定义的Stream流操作,以及如何复用和扩展现有的Stream流操作。通过自定义Stream流操作,我们可以更灵活地处理数据,适应各种复杂的业务需求。

  1. 实现自定义Stream流操作
    • 编写自定义中间操作
      自定义Stream流的中间操作可以帮助我们对数据进行更精确的处理,从而提高代码的可读性和复用性。这些操作通常包括数据过滤、数据转换等功能。
      public class CustomStreamOperations {public static Stream<String> filterByLength(Stream<String> stream, int length) {return stream.filter(s -> s.length() == length);}
      }
      
      代码说明: 上述代码为一个自定义的Stream中间操作,用于过滤输入字符串流中长度为特定值的字符串。
    • 编写自定义终端操作
      自定义Stream流的终端操作可以帮助我们对处理过的数据进行进一步的汇总、统计等操作。这些操作通常包括数据聚合、数据分组等功能。
      public class CustomStreamOperations {public static void printToConsole(Stream<String> stream) {stream.forEach(System.out::println);}
      }
      
      代码说明: 上述代码为一个自定义的Stream终端操作,将最终处理的结果输出到控制台。
  2. Stream流操作的复用与扩展
    • 封装常用Stream流操作
      将常用的Stream流操作封装成工具类或者函数,可以方便地在项目中复用,提高代码的可维护性和可读性。
      public class CommonStreamOperations {public static Stream<String> convertToUpperCase(Stream<String> stream) {return stream.map(String::toUpperCase);}
      }
      
    • 扩展现有Stream流操作的功能
      根据业务需求,我们可以在现有的Stream操作基础上进行功能扩展,满足更多复杂的数据处理需求。
      public class ExtendedStreamOperations {public static Stream<String> filterAndSort(Stream<String> stream) {return stream.filter(s -> s.length() > 5).sorted();}
      }
      

自定义Stream流操作实例

下面我们通过一个示例来演示如何利用自定义Stream流操作来处理数据:

import java.util.Arrays;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {Stream<String> names = Stream.of("Alice", "Bob", "Charlie", "David");Stream<String> filteredNames = CustomStreamOperations.filterByLength(names, 5);CustomStreamOperations.printToConsole(filteredNames);Stream<String> fruits = Stream.of("Apple", "Banana", "Orange", "Grape");Stream<String> upperCaseFruits = CommonStreamOperations.convertToUpperCase(fruits);CommonStreamOperations.printToConsole(upperCaseFruits);Stream<String> animals = Stream.of("Elephant", "Tiger", "Lion", "Zebra");Stream<String> filteredAndSortedAnimals = ExtendedStreamOperations.filterAndSort(animals);ExtendedStreamOperations.printToConsole(filteredAndSortedAnimals);}
}

代码说明: 上述示例代码演示了如何使用自定义Stream中间操作和终端操作对数据进行处理,并展示了结果输出的效果。通过自定义操作,我们可以轻松实现对数据流的精确控制和定制化处理。

自定义Stream流操作流程图

下面是一个使用mermaid格式的流程图,展示了自定义Stream流操作的处理流程:

开始
过滤长度为5的字符串
转换为大写
过滤并排序字符串
结束

通过自定义Stream流操作,我们可以在Java 8中更加灵活地处理数据,满足各种复杂的业务需求。自定义中间操作和终端操作可以极大地提升代码的可扩展性和可维护性,使我们的代码更加优雅和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt实现实时抓取串口数据,并对数据做解密处理

效果&#xff1a; 1.实时抓取串口数据&#xff0c;并对串口数据做解密&#xff0c;解密后显示在QTextEdit上。 2.对显示的内容做特殊关键字标记处理&#xff0c;比如对出现的Error关键字标红 高亮另一个版本 3.对显示的明文进行查询&#xff0c;类似编辑文件中的CtrlF 4.对串口…

Mac环境简化RSA密钥生成命令

文章目录 正常RSA密钥对生成操作命令 openssl genrsa -out rsa_private_key.pem 2048 openssl rsa -pubout -in rsa_private_key.pem -out rsa_public_key.pem通过添加环境变量来简化RSA密钥对生成操作 设置环境变量.zshrc或.bash_profile # 使用zsh终端 vim ~/.zshrc将下面sh…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 混淆前后对比 iOS代码混淆 …

南京航空航天大学-考研科目-513测试技术综合 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分

系列文章目录 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分 文章目录 系列文章目录前言总结 前言 单片机的基础内容繁杂&#xff0c;有很多同学基础不是很好&#xff0c;对一些细节也没有很好的把握。非常推荐大家去学习一下b站上的哈工大 单片机原理及…

开通抖音小店后下一步要干嘛?这些准备比选品更重要!新手必看!

哈喽~我是电商月月 很多入驻完抖音小店的新手朋友总以为&#xff0c;入驻完抖音小店后&#xff0c;下一步就是去选品 其实并不是&#xff01;选品确实很重要&#xff0c;但前期这几个细节没做好&#xff0c;是会直接影响店铺的整体发展的 废话不多说&#xff0c;直接分享给你…

2024年6月PMP报名已开始!项目经理抓紧啦!

根据《2024年6月1日PMI认证考试报名通知》可知&#xff0c;2024年6月PMP考试安排在6月1日举行&#xff0c;那报名入口什么时候开通呢&#xff1f;2024年6月PMP考试分批报名&#xff0c;从4月10日10:00开启报名&#xff0c;4月18日16:00截止报名。 第一批报名城市&#xff1a;2…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

Dockfile相关

一、Dockerfile能干什么? 能在里面自定义应用的各种环境配置,来构建镜像;它是一种实现途径。 1.1Dockerfile文件组成 1.基础镜像信息 FROM 2.维护者信息 LABEL 3.镜像操作指令 ENV ADD COPY RUN 4.启动时执行指令 CMD ENTRYPOINT 1.2Dockerfile多阶段构建 一个镜像的构…

python批量修改替换cad图纸文本,土木狗可以有

civilpy&#xff1a;python进行AutoCAD绘图的两个库&#xff0c;土木狗可以有3 赞同 0 评论文章​编辑 civilpy&#xff1a;python进行AutoCAD绘图批量打印&#xff0c;土木狗可以有2 赞同 2 评论文章​编辑 # 导入所需库 from pyautocad import Autocad, APoint import ma…

LeetCode 94 二叉树的中序遍历

题目描述 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入…

hive管理之ctl方式

hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 &#xff01; clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 &#xff01;命令…

WinAppDriver 自动化测试winform程序

WinAppDriver 自动化测试winform程序 前言 WinAppDriver是Windows系统上的一个应用程序驱动工具&#xff0c;开源免费。与Selenium工具类似&#xff0c;都是用来实现产品UI自动化测试的一个工具。 WinAppDriver运行时对系统是有要求的&#xff0c;只能运行在Windows10或Wind…

2024/4/6—力扣—简化路径

代码实现&#xff1a; // 分割/得到名字 char **split(const char *s, int *returnSize) {int n strlen(s);char **ans (char **)malloc(sizeof(char *) * n);int l 0, r 0, len 0;while (r < n) {while (r < n && s[r] /) {r;}l r;while (r < n &…

Python | 海表面温度(SST) | 长期趋势和异常分析

趋势和异常分析&#xff08;Trend and anomaly)在大气和海洋学研究中被广泛用于探测长期变化。 趋势分析&#xff08;Trend Analysis&#xff09;&#xff1a; 趋势分析是一种用于检测数据随时间的变化趋势的方法。在海洋学和大气学中&#xff0c;常见的趋势分析包括海表面温…

WeTrade众汇账户类型有哪几种?FX110网

WeTrade众汇是一个在线交易平台&#xff0c;允许用户买卖各种金融工具&#xff0c;包括交易外汇、金属、能源、指数、股票和加密货币。 WeTrade众汇不仅提供多种交易市场&#xff0c;还提供多种有竞争力的工具和服务。那么&#xff0c;WeTrade众汇账户类型有哪几种&#xff1f;…

CF938Div3(A-F)

A: 买n个酸奶&#xff0c;一次一瓶a元,一次买两瓶可以优惠价b元,也可以a元,问恰好买n瓶需要多少钱. void solve() {int n, a, b;cin >> n >> a >> b;int ans min(a * n, n / 2 * b n % 2 * a);cout << ans << endl; } B: 给你一个数组,问能…

AWVS/Acunetix Premium V24.3.2403高级版漏洞扫描器

前言 Acunetix Premium 是一种 Web 应用程序安全解决方案&#xff0c;用于管理多个网站、Web 应用程序和 API 的安全。集成功能允许您自动化 DevOps 和问题管理基础架构。 Acunetix Premium&#xff1a;全面的 Web 应用程序安全解决方案 Web 应用程序对于企业和组织与客户、…

Vue 大文件切片上传实现指南包会,含【并发上传切片,断点续传,服务器合并切片,计算文件MD5,上传进度显示,秒传】等功能

Vue 大文件切片上传实现指南 背景 在Web开发中&#xff0c;文件上传是一个常见的功能需求&#xff0c;尤其是当涉及到大文件上传时&#xff0c;为了提高上传的稳定性和效率&#xff0c;文件切片上传技术便显得尤为重要。通过将大文件切分成多个小块&#xff08;切片&#xff0…

【Python 基础知识课程】Python的第一个程序

Python 简介 Python 是一种功能强大且用途广泛的编程语言&#xff0c;广泛用于数据科学、Web 开发、自动化等高需求领域。 幸运的是&#xff0c;对于初学者来说&#xff0c;它也是一种很好的学习语言&#xff0c;因为Python代码更容易阅读和编写。它的简单性使其成为初学者的完…

【Qt】:窗口

窗口 一.概述二.菜单栏1.一个简单的菜单2.添加快捷键3.嵌套子菜单4.添加下划线5.添加图标 三.工具栏1.创建一个简单的工具栏2.设置工具栏的停靠位置 四.状态栏五.浮动窗口 一.概述 Qt窗口是通过QMainWindow类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&#xff0c…