“就这儿,你做了 8 个小时?” 老板说。

本文讲述了橡皮擦更换全网头像的设计过程。老板提出需求,橡皮擦历经多轮设计,期间融入蜘蛛元素、程序 BUG 等,还与设计师沟通协作,但多次设计未让老板满意,最终经过修改得到了所谓“高端大气上档次”的头像。

今天是持续写作的第 30 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。

2020 年12月16日,橡皮擦更换了全网头像,是一个值得纪念的日子,而且充分体验了一把设计的痛苦。

声明:在改头像之前,橡皮擦使用的一直是女神戚薇的头像,因为老板觉得,俺也一样。
橡皮擦换头像啦
接下来就是一个漫长而又充满乐趣的过程了。

老板与橡皮擦的对话

老板:我们要更换一个全网唯一,并且充满辨识度的头像,你先出两版创意吧,我挑挑。
橡皮擦:好的,老板,我也觉得咱要弄个高级点的头像了。

1个小时过去了

橡皮擦发给老板的创意,输出物如下。
橡皮擦换头像啦
2个小时过去了

老板:设计一弄个草稿图吧。
橡皮擦:好嘞,老板。

橡皮擦输出物。
橡皮擦换头像啦

老板:你这是做了个啥?
橡皮擦:emmmm… 刚才开发过来问了点问题,我画的抽象了一些。

老板:这是个啥,抓紧改。

橡皮擦工作中…

动作,表情设计中,图片实在发虚。
橡皮擦换头像啦
草图继续设计中…,因为铅笔的原因,颜色较浅,凑合看,感受,要感受。
橡皮擦换头像啦
最终实现了一款动感十足的橡皮擦。
橡皮擦换头像啦
这时候,真要赞美一下自己,有时候创意来了,简直停不下来,只给大家呈现了一小部分,好多创意我都收藏起来了,以后用。

3个小时过去了

橡皮擦:老板,您看我这动感的橡皮擦造型如何?是不是已经可以设计矢量图了?
老板:还可以,不过咱有套爬虫百例的课程,能不能结合下蜘蛛的元素。
橡皮擦:…,老板,您说的对,英明。

橡皮擦回去做图中…

橡皮擦换头像啦
4个小时过去了
橡皮擦换头像啦

橡皮擦:老板,您看,我融入了蜘蛛的元素,融入了程序BUG,还额外增加了爬虫常见的404操作,怎么样?
老板:恩,还不错,可以给设计了试试了。

6个小时过去了

小设计:橡皮擦吖,你这图有点难实现吖,我给融入了一些时尚的设计元素,你看看效果。
橡皮擦:时尚,啥时尚,给我看看。

设计发过来的对比图。
橡皮擦换头像啦
橡皮擦:emmm… 你这个设计,这个 … 真漂亮吖。等着我发老板去。这个月咱俩的奖金有了。

7个小时过去了

橡皮擦:老板,咱们的新头像做好了,给您发微信了。
老板:收到,会后回复。

8个小时过去了

老板:橡皮擦吖,你这是做了个啥,这个能用吗?你审美是不是有问题,就这儿,你做了8个小时?
橡皮擦:老板,您听我解释,我们这个使用了 XXXX 元素,XXXX 设计风格,凸显了 XXXX,实乃惊艳设计…
老板:别废话了,修改的简洁大方一些。

9个小时过去了

10个小时过去了

晚上10:30

小设:橡皮擦吖,你放过我吧,我实在弄不了了,你要不问问老板咋办?
橡皮擦:问老板?老板说了简洁大气上档次,你能 get 到吗?
小设:我特喵get 不到。
橡皮擦:要不,咱这么干吧。就这隐藏,这放大,这隐藏,在放大,大,大,唉,好了。

最终的结果,大家看到了。高端,大气,上档次。
橡皮擦换头像啦

橡皮擦叨叨:我们这个老板一点审美都没有,抽时间要给他翻译翻译什么叫做惊喜。

<think>嗯,用户想学习Java 8的Stream流,该怎么教他们呢?首先得了解他们的背景。可能他们已经有一些Java基础,但没接触过Stream。需要从基础开始,逐步深入。 首先,得介绍Stream是什么。用户可能听过Stream处理集合更方便,但具体概念还不清楚。要解释Stream和集合的区别,比如元素序列、源数据、函数式操作这些点。可能还要提到中间操作和终端操作的区别,比如filter是中间操作,collect是终端操作,这样他们不会混淆。 然后,需要举一些简单的例子,比如创建Stream的方式。从集合转换是最常见的,可以用stream()方法。数组的话用Arrays.stream,或者直接用Stream.of。例子要简单明了,比如用List转Stream,这样用户能马上上手。 接下来是常用操作。filter、map、sorted这些中间操作,还有collect、forEach这些终端操作。每个操作都需要例子明。比如用filter过滤字符串长度,用map转换成大写,sorted排序。例子代码要简洁,展示出链式调用的优势,对比传统循环,突出Stream的简洁性。 然后,可能用户会想知道更多高级操作,比如flatMap处理嵌套集合,reduce进行归约,还有统计操作如sum、average。这时候需要例子展示如何扁平化流,比如把多个列表合并,或者计算总和。这些例子能帮助用户理解更复杂的场景。 并行流也是一个重点,毕竟Stream的优势之一就是并行处理。需要解释parallelStream的使用,但也要提醒线程安全的问题,比如在reduce操作中累加器要符合规范,避免并发问题。例子用并行流计算总和,对比串行流,明性能提升的可能性。 接下来,学习资源推荐。官方文档是必须的,但可能有些用户觉得枯燥,所以推荐一些书籍,比如《Java 8实战》,还有在线教程如Baeldung,这些资源比较友好。另外,实践项目很重要,可以建议他们用Stream重构旧代码,或者处理数据,比如统计日志信息,这样能巩固所学。 最后,注意事项部分要强调Stream的一次性消费,避免重复使用;区分中间和终端操作,防止遗漏终端操作导致不执行;性能方面,小数据可能传统循环更快,大数据用并行流。这些注意事项能帮助用户避免常见错误。 整个思考过程中,要确保结构清晰,从概念到操作,再到高级特性和资源,逐步引导用户。例子要具体,避免太抽象的解释,让用户能动手实践。同时,提醒他们注意事项,避免踩坑。可能用户需要对比传统方式和Stream的区别,所以在例子中适当比较,突出Stream的优点。还要考虑用户可能遇到的问题,比如为什么终端操作没执行,或者并行流的线程安全,提前给出提示。</think>要系统学习Java 8的Stream流,可以按以下步骤逐步掌握: --- ### 一、理解核心概念 1. **什么是Stream**: - 不是数据结构,而是对数据源(集合、数组等)进行函数式操作的流水线 - 特点:不存储数据、不修改源数据、延迟执行 2. **与集合的区别**: $$集合 = 存储 + 操作数据 \quad vs \quad Stream = 声明式操作$$ --- ### 二、掌握基础操作 #### 1. 创建Stream ```java // 从集合创建 List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); // 从数组创建 String[] array = {"a", "b"}; Stream<String> stream = Arrays.stream(array); // 直接创建 Stream<String> stream = Stream.of("a", "b"); ``` #### 2. 常用中间操作 ```java List<String> result = list.stream() .filter(s -> s.length() > 3) // 过滤 .map(String::toUpperCase) // 转换 .sorted() // 排序 .distinct() // 去重 .skip(1) // 跳过元素 .limit(5) // 限制数量 .collect(Collectors.toList()); // 终端操作 ``` --- ### 三、掌握进阶特性 #### 1. 并行流 ```java long count = list.parallelStream() // 自动并行处理 .filter(s -> s.contains("a")) .count(); ``` #### 2. 数值流(避免装箱) ```java IntStream.rangeClosed(1, 100) // 生成1-100的int流 .sum(); ``` #### 3. 高级收集器 ```java Map<Integer, List<String>> groupByLength = list.stream() .collect(Collectors.groupingBy(String::length)); String joined = list.stream() .collect(Collectors.joining(", ")); ``` --- ### 四、典型应用场景 1. **数据过滤**: ```java List<User> adults = users.stream() .filter(u -> u.getAge() >= 18) .collect(Collectors.toList()); ``` 2. **数据转换**: ```java List<String> emails = users.stream() .map(User::getEmail) .collect(Collectors.toList()); ``` 3. **统计计算**: ```java Double average = users.stream() .collect(Collectors.averagingInt(User::getAge)); ``` --- ### 五、学习资源推荐 1. **官方文档**: - [Java 8 Stream API](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) 2. **实战书籍**: - 《Java 8实战》(Java 8 in Action) 3. **在线教程**: - Baeldung的[Java Stream指南](https://www.baeldung.com/java-8-streams) - 菜鸟教程的[Java 8新特性](https://www.runoob.com/java/java8-new-features.html) --- ### 六、练习建议 1. **重构现有代码**:将传统for循环改写成Stream操作 2. **解决实际问题**: - 统计日志文件中不同错误类型的出现次数 - 处理嵌套集合(如`List<List<Integer>>`) 3. **参与编程挑战**:在LeetCode等平台用Stream解题 --- ### 七、注意事项 1. **流只能消费一次**:终端操作后流即关闭 2. **区分中间/终端操作**:缺少终端操作时中间操作不会执行 3. **避免副作用**:不要在lambda表达式中修改外部变量 4. **性能权衡**:小数据集可能传统循环更快,大数据集用并行流更高效 通过理论+实践结合,约20小时系统学习即可掌握核心用法。建议从简单案例入手,逐步尝试复杂场景的流式处理。
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值