ASList

恕我直言你可能真的不会java第10篇-集合元素归约

痞子三分冷 提交于 2020-08-09 20:39:43
Stream API为我们提供了 Stream.reduce 用来实现集合元素的归约。reduce函数有三个参数: Identity标识 :一个元素,它是归约操作的初始值,如果流为空,则为默认结果。 Accumulator累加器 :具有两个参数的函数:归约运算的部分结果和流的下一个元素。 Combiner合并器(可选) :当归约并行化时,或当累加器参数的类型与累加器实现的类型不匹配时,用于合并归约操作的部分结果的函数。 注意观察上面的图,我们先来理解累加器: 阶段累加结果作为累加器的第一个参数 集合遍历元素作为累加器的第二个参数 Integer类型归约 reduce初始值为0,累加器可以是lambda表达式,也可以是方法引用。 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int result = numbers .stream() .reduce(0, (subtotal, element) -> subtotal + element); System.out.println(result); //21 int result = numbers .stream() .reduce(0, Integer::sum); System.out.println(result); //21 String类型归约

如何高效地判断数组中是否包含某特定值

℡╲_俬逩灬. 提交于 2020-08-09 13:26:23
如何检查一个未排序的数组中是否包含某个特定值,这是一个在Java中非常实用并且频繁使用的操作。检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大。下面,将为大家展示各种方法及其需要花费的时间。 1.检查数组中是否包含特定值的四种不同方法 1)使用List: 1 2 3 public static boolean useList(String[] arr, String targetValue) { return Arrays.asList(arr).contains(targetValue); } 2)使用Set: 1 2 3 4 public static boolean useSet(String[] arr, String targetValue) { Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue); } 3)使用一个简单循环: 1 2 3 4 5 6 7 public static boolean useLoop(String[] arr, String targetValue) { for(String s: arr){ if(s.equals(targetValue)) return true; } return

将数组转换为Java中的列表

断了今生、忘了曾经 提交于 2020-08-09 10:19:08
问题: How do I convert an array to a list in Java? 如何在Java中将数组转换为列表? I used the Arrays.asList() but the behavior (and signature) somehow changed from Java SE 1.4.2 (docs now in archive) to 8 and most snippets I found on the web use the 1.4.2 behaviour. 我使用了 Arrays.asList() 但是其行为(和签名)从Java SE 1.4.2 (现在已存档的文档)以某种方式更改为 8, 并且我在网络上发现的大多数代码片段都使用1.4.2行为。 For example: 例如: int[] spam = new int[] { 1, 2, 3 }; Arrays.asList(spam) on 1.4.2 returns a list containing the elements 1, 2, 3 在1.4.2上返回包含元素1,2,3的列表 on 1.5.0+ returns a list containing the array spam 在1.5.0+上返回包含数组垃圾邮件的列表 In many cases it should be

JAVA List<T>转成另一个List<M> stream

淺唱寂寞╮ 提交于 2020-08-08 19:07:49
在Java 8中stream().map(),您可以将对象转换为其他对象。查看以下示例: 1.大写字符串列表 1.1简单的Java示例将Strings列表转换为大写。 TestJava8.java package com.mkyong.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class TestJava8 { public static void main(String[] args) { List<String> alpha = Arrays.asList("a", "b", "c", "d"); //Before Java8 List<String> alphaUpper = new ArrayList<>(); for (String s : alpha) { alphaUpper.add(s.toUpperCase()); } System.out.println(alpha); //[a, b, c, d] System.out.println(alphaUpper); //[A, B, C, D] // Java 8 List<String> collect =

Lambda表达式用法大比较: Scala和Java 8

廉价感情. 提交于 2020-08-08 11:15:52
最近几年Lambda表达式风靡于编程界. 很多现代编程语言都把它作为函数式编程的基本组成部分. 基于JVM的编程语言如Scala,Groovy还有Clojure把它们作为关键部分集成在语言中.现在Java8也加入了它们的行列. 有趣的是,对于JVM来说,Lambda表达式是完全不可见的,并没有匿名函数和Lamada表达式的概念,它只知道字节码是严格面向对象规范的.它取决于语言的作者和它的编译器在规范限制内创造出更新,更高级的语言元素. 我们第一次接触它是在我们要给Takipi添加Scala支持的时候, 我们不得不深入研究Scala的编译器.伴随着JAVA8的来临,我认为探究Scala和java编译器是如何实现Lambda表达式是非常有趣的事情.结果也是相当出人意料. 接下来,我展示一个简单的Lambda表达式,用于将字符串集合转化成字符串自身长度的集合。 Java的写法 – 1List names = Arrays.asList("1", "2", "3"); 2Stream lengths = names.stream().map(name -> name.length()); Scala的写法 – 1.val names = List("1", "2", "3") 2.val lengths = names.map(name =>name.length) 表面上看起来非常简单

Java中的不可变集合,我们换个方式理解!!!

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-07 20:54:20
不可变集合例: public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple"); class Foo { Set<Bar> bars; Foo(Set<Bar> bars) { this.bars = ImmutableSet.copyOf(bars); // defensive copy! } } 为什么要使用不可变集合 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的; 不可变对象被多个线程调用时,不存在竞态条件问题 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节); 不可变对象因为有固定不变,可以作为常量来安全使用。 创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。 JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为不够好: 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景; 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;

动态规划

人走茶凉 提交于 2020-08-07 06:19:04
152. 乘积最大子数组 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 package com.demo.thinking ; import java.util.Arrays ; import java.util.List ; public class MaxProduct { public static void main (String[] args) { List<Integer> list = Arrays. asList (- 2 , 0 , - 1 , 3 , 6 ) ; int i = maxProduct (list) ; System. out .println(i) ; } public static int maxProduct (List<Integer> nums) { Integer maxF = nums.get( 0 ) , minF = nums.get( 0 ) , ans = nums.get( 0 ) ; for ( int i = 1 ; i <

Java8——Stream流

扶醉桌前 提交于 2020-08-07 05:29:48
Stream 是数据渠道,用于操作集合、数组等生成的元素序列。 Stream 操作的三个步骤: 创建Stream 中间操作 终止操作 一、获取stream的四种方式 通过 collection 系列集合的 stream() 或 parallelStream() 获取。 @Test void test11(){ List<String> list = new ArrayList<>(); Stream<String> stringStream = list.stream(); } 通过 Arrays 中的静态方法 stream() 获取数组流。 @Test void test11(){ Person[] person = new Person[10]; Arrays.stream(person); } 通过 Stream 中的静态方法 of() 。 @Test void test11(){ Stream<String> stream = Stream.of("a", "b", "c"); } 创建无限流 /** * 迭代 */ @Test void test11(){ Stream<Integer> integerStream = Stream.iterate(0, x -> x + 2); } /** * 生成 */ @Test void test11(){ Stream

Arrays.asList 有坑,千万别踩!

不打扰是莪最后的温柔 提交于 2020-08-06 13:43:39
作者:我想问问天 juejin.im/post/5d10e52ee51d454f6f16ec11 阿里巴巴** Java开发规范 说到使用工具类 Arrays.asList()**方法把数组转换成集合时,不能使用其修改集合相关的方法。 因为它的 add/remove/clear 方法会抛出 UnsupportedOperationException (),我们来看一下为什么会出现这种情况。 问题分析 我们做个测试: public static void main(String[] args) { List<String> list = Arrays.asList("a", "b", "c"); // list.clear(); // list.remove("a"); // list.add("g"); } 被注释的三行可以分别解开注释,运行后确实出现了规约中所说的异常。我们来看下Arrays.asList()做了什么操作。 public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 看上去是个很正常的方法,然而实际上你点进到ArrayList发现,其实ArrayList并不是我们平时用的ArrayList。 private static class ArrayList<E> extends

Spring Cloud Zuul过滤器介绍及使用

旧街凉风 提交于 2020-08-06 04:47:52
过滤器类型 Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可以通过配置 urlPatterns 来拦截对应的请求。 而 Zuul 中的过滤器总共有 4 种类型,且每种类型都有对应的使用场景。 1)pre 可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。 2)route 在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。 3)post 在 route 和 error 过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。 4)error 处理请求时发生错误时被调用。在执行过程中发送错误时会进入 error 过滤器,可以用来统一记录错误信息。 请求生命周期 可以通过图 1 看出整个过滤器的执行生命周期, 图 1 过滤器生命周期 通过上面的图可以清楚地知道整个执行的顺序,请求发过来首先到 pre 过滤器,再到 routing 过滤器,最后到 post 过滤器,任何一个过滤器有异常都会进入 error 过滤器。 通过 com.netflix.zuul.http.Zuul Servlet 也可以看出完整执行顺序,ZuulServlet 类似 Spring -Mvc 的