ASList

架构师内功心法,参与电商订单业务开发的状态模式详解

只愿长相守 提交于 2020-03-21 14:47:40
3 月,跳不动了?>>> 状态模式在生活场景中也是比较常见的。比如我们平时网购的订单状态变化,还有平时坐电梯,电梯状态的变化。 在软件开发过程中,对于某一项的操作,可能存在不同的情况。通常处理多情况问题最直接的办法就是使用if...else或者switch...case条件语句进行判断。这种做法对于复杂状态的判断天然存在弊端:判断条件语句过于臃肿,可读性较差,不具备扩展性,维度难度也很大。如果转换一下思维,将这些不同状态独立起来用各种不同的类进行表示,系统处理哪种情况,直接使用相应的状态类进行处理,消除条件判断语句,代码也更加具有层次感,且具备良好的扩展能力。 状态模式(State Pattern)也成为状态机模式(State Machine Pattern),是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。状态模式中类的行为是由状态决定的,不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候,其行为也随之改变。状态模式的核心就是状态与行为绑定,不同的状态对应不同的行为。 一、状态模式的应用场景 状态模式适用于以下几种场景: 行为随状态改变而改变场景; 一个操作中含有庞大的多分支机构,并且这些分支取决于对象的状态。 状态模式主要包含三种角色: 环境类角色(Context):定义客户端需要的接囗,内部维护一个当前状态实例,并负责具体状态的切换;

获取接口所有子类和获取枚举扩展属性

陌路散爱 提交于 2020-03-20 05:52:04
3 月,跳不动了?>>> 问题: 如何根据接口获取所有子类/实现类 获取枚举的所有值 反射获取扩展属性 处理 引入 reflections 类库 <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.12</version> </dependency> 枚举接口定义 public interface IEnum<T extends Enum> { int getCode(); String getDesc(); String getName(); IEnum[] enumValues(); } import lombok.Builder; import lombok.Data; @Data @Builder public class EnumItem { String name; int code; String desc; } 遍历所有实现类,放入枚举Map Reflections reflections = new Reflections("com.demo.common.consts.enums"); Set<Class<? extends IEnum>> items = reflections.getSubTypesOf(IEnum

java面向对象2(19) ​​​​​​​集合工具类(快捷操作工具)

一个人想着一个人 提交于 2020-03-04 22:47:13
​ 集合工具类 快捷排序、快捷打乱顺序、快捷查找元素、快捷展示控制台 一. 集合快捷操作工具-Collections Collections是集合工具类,专门对集合( ArrayList 、 LinkedList 、 Vector )进行操作。 常用方法: 方法名称 描述 public static <T> void sort (List<T> list) 从小到大排序 默认只能对基本数据类型 public static <T> int binarySearch(List<?> list,T key) 查找元素索引(必须先排序),否则无法返回索引 元素重复,寻找最后一个出现的元素【不研究】 public static void shuffle(List<?> list) 随机打乱元素顺序 public addAll ( Collection <? super T> c, T... elements) 一次添加多个元素 实用举例: /* * Collections工具类: * */ public static void main(String[] args) { //创建ArrayList集合 ArrayList<Integer> list1 = new ArrayList<Integer>(); //1、快捷一次性添加数据:addAll Collections. addAll

Java容器——UnsupportedOperationException

折月煮酒 提交于 2020-03-01 06:50:16
先看一个例子: import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; public class UnsupportedOperation { static void test(String msg, List<String> list) { System.out.println("----------" + msg + "----------"); Collection<String> c = list; Collection<String> subList = list.subList(1, 4); Collection<String> subList2 = new ArrayList<>(subList); try { c.retainAll(subList2); } catch (Exception e) { System.out.println("retainAll: " + e); } try { c.removeAll(subList2); } catch (Exception e) { System.out.println("removeAll: " +

Stream流的使用

血红的双手。 提交于 2020-02-29 03:57:46
Stream流的使用 本篇主要讲解JDK8中 Stream流的使用, 包括如何 筛选 、切片、映射 、查找、匹配 、归约 等等 每个类型都会有对应的案例 简单易懂  1.Stream的概念  Stream API是JDK8新添加的处理集合的关键组件,这里的Stream流和I/O流不同,Stream是对集合对象功能的增强,它专注对集合对象提供各种便利的操作,只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等, Stream会隐式地在内部进行遍历,做出相应的数据转换 。  2.Stream流的创建   2.1 从集合创建 List<Integer> list = new ArrayList<>(); //1.从集合创建流 list.stream(); list.parallelStream();   2.2 从数组创建 //Arrays的静态方法 stream Arrays.stream(new int[] {1, 2, 3,});   2.3 创建数字流 //IntStream流 int intarr[] = {1,2,3}; IntStream.of(1,2,3); IntStream.of(intarr); //LongStream流 long longarr[] = {1L , 2L , 3L}; LongStream.of

每天AC系列(四):四数之和

[亡魂溺海] 提交于 2020-02-27 13:32:59
1 题目 Leetcode第18题 ,给定一个数组与一个target,找出数组中的四个数之和为target的不重复的所有四个数. 2 暴力 List<List<Integer>> result = new ArrayList<>(); if (nums.length == 4 && nums[0] + nums[1] + nums[2] + nums[3] == target) result.add(Arrays.asList(nums[0], nums[1], nums[2],nums[3])); else if (nums.length > 4) { Arrays.sort(nums); Set<List<Integer>> resultSet = new HashSet<>(); for(int i=0;i<nums.length-3;++i) { for(int j=i+1;j<nums.length-2;++j) { for(int k=j+1;k<nums.length-1;++k) { for(int m=k+1;m<nums.length;++m) { if(nums[i]+nums[j]+nums[k]+nums[m] == target) resultSet.add(Arrays.asList(nums[i],nums[j],nums[k],nums[m]));

7、配置类解析

自作多情 提交于 2020-02-27 07:24:05
1、全局流程解析 public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. //

集合的一些坑

只愿长相守 提交于 2020-02-27 05:40:29
1 集合的一些坑 当集合的元素是自定义类时,自定义类强制实现 equals 和 hashCode 方法,并且两个都要实现。 在集合中,除了 TreeMap 和 TreeSet 是通过比较器比较元素大小外,其余的集合类在判断索引位置和相等时,都会使用到 equals 和 hashCode 方法,这个在之前的源码解析中,我们有说到,所以当集合的元素是自定义类时,我们强烈建议覆写 equals 和 hashCode 方法,我们可以直接使用 IDEA 工具覆写这两个方法,非常方便; 所有集合类,在 for 循环进行删除时,如果直接使用集合类的 remove 方法进行删除,都会快速失败,报 ConcurrentModificationException 的错误,所以在任意循环删除的场景下,都建议使用迭代器进行删除; 我们把数组转化成集合时,常使用 Arrays.asList(array),这个方法有两个坑,代码演示坑为: public void testArrayToList ( ) { Integer [ ] array = new Integer [ ] { 1 , 2 , 3 , 4 , 5 , 6 } ; List < Integer > list = Arrays . asList ( array ) ; // 坑1:修改数组的值,会直接影响原 list log . info (

牛客OJ Java范例

跟風遠走 提交于 2020-02-26 10:42:59
每个OJ平台上的题目有简单有容易的,但是一定要预先熟悉OJ平台的规则,因为OJ平台的输入输出等都要遵循一定的规范,否则可能即使代码没问题,也拿不到分数。这几天在牛客网上做了一些题目,为避免浪费时间做了一个模板,可以直接在该模板下进行代码编辑。 0.牛客网机试模板 import java.util.*; import static java.lang.System.out; public class Main { public static void main(String[] argv) { try (Scanner sc = new Scanner(System.in)) { sc.useDelimiter("\n"); while (sc.hasNext()) { String inputStr = sc.nextLine(); List<String> result = Arrays.asList(inputStr.split(" ")); //------------------------------------------- //------------------------------------------- out.println(String.join(",", result)); } } } } 1.一定要注意引用的package,否则可能导致无法编译

侠说java8--Stream流操作学习笔记,都在这里了

帅比萌擦擦* 提交于 2020-02-26 09:19:57
前言 首次接触到Stream的时候以为它是和InputStream、OutputStream这样的输入输出流的统称。 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合。集合是一种内存中的数据结构,用来保存对象数据,集合中的每个元素都得先算出来才能添加到集合中,相比之下: 集合用特定数据结构(如List,Set或Map)存储和分组数据。但是,流用于对存储的数据(例如数组,集合或I / O资源)执行复杂的数据处理操作,例如过滤,匹配,映射等。由我们可以知道: 集合主要是存储数据,而流主要关注对数据的操作。 数据修改 我们可以添加或删除集合中的元素。但是,不能添加或删除流中的元素。流是通过消费数据源的方式,对其执行操作并返回结果。它不会修改数据源头。 内部迭代和外部迭代 Java8提供的 Streams的主要特点是我们不必担心使用流时的迭代。流在后台为我们内部执行迭代。我们只需关注在数据源上需要执行哪些操作即可。 循环遍历 流只能遍历一次。如果你遍历该流一次,则将其消耗掉。要再次遍历它,必须再次从数据源中获取新的流。但是,集合可以遍历多次。 惰性求值(懒汉or饿汉) 相信大家都知道单例模式中的两种模式,懒汉式和饿汉式,在这里也可以相似的理解。 集合以饿汉式迅速的构建,即是所有元素都在开始时就进行了计算。但是,流是延迟构造的,即在调用终端操作之前不会去计算中间操作