IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> do while 的妙用 -> 正文阅读

[Java知识库]do while 的妙用

准备工作

有下面这样一个类结构

class R1 {
	
	private String t1;

	public R1(String t1) {
		this.t1 = t1;
	}

	public String getT1() {
		return t1;
	}

	public void setT1(String t1) {
		this.t1 = t1;
	}
	
}

class R2 {
	
	private R1 r1;

	public R2(R1 r1) {
		this.r1 = r1;
	}

	public R1 getR1() {
		return r1;
	}

	public void setR1(R1 r1) {
		this.r1 = r1;
	}
	
}

class R3 {
	
	private R2 r2;

	public R3(R2 r2) {
		this.r2 = r2;
	}

	public R2 getR2() {
		return r2;
	}

	public void setR2(R2 r2) {
		this.r2 = r2;
	}
	
}

class R4 {
	
	private R3 r3;

	public R4(R3 r3) {
		this.r3 = r3;
	}

	public R3 getR3() {
		return r3;
	}

	public void setR3(R3 r3) {
		this.r3 = r3;
	}
	
}

从R4对象中取出R1对象中的t1的值,并打印。其中任意对象可能为null。你会怎么做?

套娃?

private static void nested(R4 r4) {
		String result = null;
		if (r4 != null) {
			R3 r3 = r4.getR3();
			if (r3 != null) {
				R2 r2 = r3.getR2();
				if (r2 != null) {
					R1 r1 = r2.getR1();
					if (r1 != null) {
						result = r1.getT1();
					}
				}
			}
		}
		System.out.println("nested->" + result);
	}

禁止套娃,技术太菜,开除了吧

lambda表达式取值?

private static void lambda(R4 r4) {
		String result = Optional.ofNullable(r4)
				.map(e -> e.getR3())
				.map(e -> e.getR2())
				.map(e -> e.getR1())
				.map(e -> e.getT1())
				.orElse(null);
		System.out.println("lambda->" + result);
	}

技术不错,可是老项目还在用java6或7

封装单独的方法?

private static void methodReturn(R4 r4) {
		class RetClazz {
			public String returnVal (R4 r4) {
				if (r4 == null) {
					return null;
				}
				R3 r3 = r4.getR3();
				if (r3 == null) {
					return null;
				}
				R2 r2 = r3.getR2();
				if (r2 == null) {
					return null;
				}
				R1 r1 = r2.getR1();
				if (r1 == null) {
					return null;
				}
				return r1.getT1();
			}
		}
		String result = new RetClazz().returnVal(r4);
		System.out.println("methodReturn->" + result);
	}

懂得封装,技术不错

do while (false) 是什么鬼?

private static void dowhile(R4 r4) {
		String result = null;
		do {
			if (r4 == null) {
				break;
			}
			R3 r3 = r4.getR3();
			if (r3 == null) {
				break;
			}
			R2 r2 = r3.getR2();
			if (r2 == null) {
				break;
			}
			R1 r1 = r2.getR1();
			if (r1 == null) {
				break;
			}
			result = r1.getT1();
		} while (false);
		System.out.println("dowhile->" + result);
	}

小伙子思路清奇,竟然用循环结构的break关键字,java大神要review你的代码,看你出什么妖蛾子,质量太差就开除你;C大神,嗯,这才是好码农,支持一波

这时需求变了,从R4对象中取出R1对象中的t1的值,并打印,但是当R2为null时,执行printR2null方法且不打印t1的值。其中任意对象可能为null

private static void printR2null (String method) {
		System.out.println(method + ": r2==null");
	}

我还套娃

private static void nested2(R4 r4) {
		String result = null;
		if (r4 != null) {
			R3 r3 = r4.getR3();
			if (r3 != null) {
				R2 r2 = r3.getR2();
				if (r2 != null) {
					R1 r1 = r2.getR1();
					if (r1 != null) {
						result = r1.getT1();
					}
				} else {
					printR2null("nested");
					return;
				}
			}
		}
		System.out.println("nested->" + result);
	}

虽然if嵌套太深,但好歹只加一两行代码就实现了

看我lambda大法

private static void lambda2(R4 r4) {
		boolean[] r2null = {false};
		String result = Optional.ofNullable(r4)
				.map(e -> e.getR3())
				.map(e -> {
					R2 r2 = e.getR2();
					r2null[0] = true;
					return r2;
				})
				.map(e -> e.getR1())
				.map(e -> e.getT1())
				.orElse(null);
		if (r2null[0]) {
			printR2null("lambda");
			return;
		}
		System.out.println("lambda->" + result);
	}

什么鬼东西?还定义一个数组对象?普通对象行吗?行。
定义一个boolean类型的变量不行吗?呃,这个真不行,在lambda方法体内引用外面的变量就相当于在内部类中引用外面的final变量,看IDE报了个语法错误,气得java程序员直抓狂,为什么java不支持地址传递

还是封装单独的方法好用

private static void methodReturn2(R4 r4) {
		class RetClazz {
			public Map<String, Object> returnVal (R4 r4) {
				Map<String, Object> map = new HashMap<>();
				if (r4 == null) {
					map.put("result", null);
					return map;
				}
				R3 r3 = r4.getR3();
				if (r3 == null) {
					map.put("result", null);
					return map;
				}
				R2 r2 = r3.getR2();
				if (r2 == null) {
					map.put("nullObject", R2.class);
					map.put("result", null);
					return map;
				}
				R1 r1 = r2.getR1();
				if (r1 == null) {
					map.put("result", null);
					return map;
				}
				map.put("result", r1.getT1());
				return map;
			}
		}
		Map<String, Object> map = new RetClazz().returnVal(r4);
		Object result = map.get("nullObject");
		if (result instanceof R2) {
			printR2null("methodReturn");
			return;
		}
		System.out.println("methodReturn->" + map.get("result"));
	}

你又搞什么鬼,返回值怎么变成对象了?不过好歹比前面的方法看着舒服点,就这样吧,以后需求变动就让你改。

do while (false) 再次出场

private static void dowhile2(R4 r4) {
		String result = null;
		do {
			if (r4 == null) {
				break;
			}
			R3 r3 = r4.getR3();
			if (r3 == null) {
				break;
			}
			R2 r2 = r3.getR2();
			if (r2 == null) {
				printR2null("dowhile");
				return;
			}
			R1 r1 = r2.getR1();
			if (r1 == null) {
				break;
			}
			result = r1.getT1();
		} while (false);
		System.out.println("dowhile->" + result);
	}

我是卖人体器官的,有张脸,你要吗?既没有套娃又没有定义多余对象,就这么实现了?
有人公然贩卖人体器官?报警吧。
先跑吧,我这张老脸可不能让你拿了去,不然没脸见人了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:15:04  更:2022-04-24 09:20:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:35:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码