自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(147)
  • 收藏
  • 关注

原创 Java8实战-总结51

下面的代码清单应用了这一改变,执行这段代码你会看到不同商店的价格不再像之前那样总是在一个时刻返回,而是随着商店折扣价格返回的顺序逐一地打印输出。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。此外,有的特性只在某一个类有提供,比如用于以语言无关方式格式化和解析日期或时间的。更高级的一些应用,比如操纵、解析、打印输出日期时间对象,使用不同的时区和年历。

2023-12-17 19:22:00 109

原创 Java8实战-总结50

毫无疑问,现实世界中,你的应用访问各个远程服务时很可能遭遇无法预知的延迟,触发的原因多种多样,从服务器的负荷到网络的延迟,有些甚至是源于远程服务如何评估你应用的商业价值,即可能相对于其他的应用,你的应用每次查询的消耗时间更长。你会希望尽快将不同商店中的商品价格呈现给你的用户(这是车辆保险或者机票比价网站的典型需求),而不是像你之前那样,等所有的数据都完备之后再呈现。对象,你能做的事非常有限,只能等待其运行结束,不过这也是你所期望的。由于这些原因,你希望购买的商品在某些商店的查询速度要比另一些商店更快。

2023-12-04 23:55:50 149

原创 Java8实战-总结49

回到我们正在运行的这个例子,有一家商店提供的价格是以欧元(EUR)计价的,但是你希望以美元的方式提供给你的客户。你可以用异步的方式向商店查询指定商品的价格,同时从远程的汇率服务那里查到欧元和美元之间的汇率。当二者都结束时,再将这两个结果结合起来,用返回的商品价格乘以当时的汇率,得到以美元计价的商品价格。下图展示了上面代码中创建的多个任务是如何在线程池中选择不同的线程执行的,以及它们最终的运行结果又是如何整合的。这里整合的操作只是简单的乘法操作,用另一个单独的任务对其进行操作有些浪费资源,所以你只要使用t。

2023-11-26 23:15:11 239

原创 Java8实战-总结48

你的“最佳价格查询器”应用现在能从不同的商店取得商品价格,解析结果字符串,针对每个字符串,查询折扣服务取的折扣代码。这个流程决定了请求商品的最终折扣价格(每个折扣代码的实际折扣比率有可能发生变化,所以你每次都需要查询折扣服务)。首先尝试以最直接的方式(坏消息是,这种方式是顺序而且同步执行的)重新实现findPrices,以满足这些新增的需求。你已经知道,把流转换为并行流的方式,非常容易提升该程序的性能。不过,这一方案在商店的数目增加时,扩展性不好,因为。的名称、折扣之前的价格,以及折扣代码。

2023-11-19 23:44:57 213

原创 Java8实战-总结47

你的应用99%的时间都在等待商店的响应,所以估算出的W/C比率为100。实际操作中,如果你创建的线程数比商店的数目更多,反而是一种浪费,因为这样做之后,你线程池中的有些线程根本没有机会被使用。出于这种考虑,我们建议你将执行器使用的线程数,与你需要查询的商店数目设定为同一个值,这样每个商店都应该对应一个服务线程。就这个主题而言,明智的选择似乎是创建一个配有线程池的执行器,线程池中线程的数目取决于你预计你的应用需要处理的负荷,但是该如何选择合适的线程数目呢?注意,你现在正创建的是一个由守护线程构成的线程池。

2023-11-08 22:03:16 145

原创 Java8实战-总结46

实现的版本,比刚最开始的代码中原生顺序执行且会发生阻塞的版本快。尤其是,考虑到从顺序执行的版本转换到并行流的版本只做了非常小的改动,就让人更加沮丧。具有一定的优势,因为它允许你对执行器(Executor)进行配置,尤其是线程池的大小,让它以更适合应用需求的方式进行配置,满足程序的要求,而这是并行流。考虑流操作之间的延迟特性,如果你在单一流水线中处理流,发向不同商家的请求只能以同步、顺序执行的方式才会成功。上图的上半部分展示了使用单一流水线处理流的过程,执行的流程(以虚线标识)是顺序的。表达式变得过于臃肿。

2023-11-05 21:47:03 146

原创 Java8实战-总结45

非常不幸,这种情况下会得到一个相当糟糕的结果:用于提示错误的异常会被限制在试图计算商品价格的当前线程的范围内,最终会杀死该线程,而这会导致等待。方法的执行时间仅比4秒钟多了那么几毫秒,因为对这4个商店的查询是顺序进行的,并且一个查询操作会阻塞另一个,每一个操作都要花费大约1秒左右的时间计算请求商品的价格。你会学到如何以异步的方式查询多个商店,避免被单一的请求所阻塞,并由此提升你的“最佳价格查询器”的性能和吞吐量。的工厂方法传递可选参数,指定生产者方法的执行线程是可行的,此外,上面代码中。

2023-10-30 23:47:48 127

原创 Java8实战-总结44

与此相反,如果你的意图是实现并发,而非并行,或者你的主要目标是在同一个。

2023-10-24 23:54:07 465

原创 Java8实战-总结43

现在,假设程序需要从这些属性中读取一个值,该值是以秒为单位计量的一段时间。这种反思不仅仅限于曾经写过的代码,更重要的可能是,如何与原生。方法,但是这无碍进行需要的改进,可以实现一个工具方法,将这部分逻辑封装于其中,最终返回一个希望的。,因为并不存在该名称对应的属性。即,如果给定属性对应的值是一个代表正整数的字符串,就返回该整数值,任何其他的情况都返回。无法转换为int时,代码发出一个遭遇非法参数的信号,唯一的不同是,这次需要使用。但是,正如之前介绍的,大多数情况下,可能希望这些方法能返回一个。

2023-10-23 21:44:43 113

原创 Java8实战-总结42

它的值都有可能为空,出现这种情况时,方法的返回值也不会包含任何值。不幸的是,该方法的具体实现和之前曾经实现的。经常需要调用某个对象的方法,查看它的某些属性。方法读取这个变量的值,使用这种方式还可以定义一个默认值,遭遇空的。这个方法具有明显的优势,从它的签名就能非常清楚地知道无论是。对象,如果传入的任何一个参数值为空,它的返回值亦为空。类提供的特性,可以用更好的方式来实现这个方法。对象,这个方法的行为就非常清晰了。对象为空,它不做任何操作,反之,它就对。对象的值存在,并且它符合谓词的条件,

2023-10-17 22:27:07 188

原创 Java8实战-总结41

公司必须有个名字,所以,如果遇到一个公司没有名称,需要调查数据出了什么问题,而不应该再添加一段代码,将这个问题隐藏。从语义上,可以把它们当作一回事儿,但是实际中它们之间的差别非常大:如果尝试解引用一个。,能非常清晰地界定出变量值的缺失是结构上的问题,还是算法上的缺陷,抑或是数据中的问题。举例来说,使用新的类意味着,如果你知道一个人可能有也可能没有车,那么。的一个非常重要而又实际的语义区别是,第一个例子中,在声明变量时使用的是。,这意味着需要独立面对这些,只能依赖对业务模型的理解,判断一个。

2023-10-11 22:43:24 121

原创 Java8实战-总结40

唯一的例外是保险公司的名字,不需要对它进行检查,原因很简单,因为任何一家公司必定有个名字。下面的代码清单中,试图通过一种不同的方式避免这种问题。的检查(过于激进的防御式检查甚至会在不太需要的地方添加检测代码),并且添加的方式往往各有不同。然而,这种方案远非理想,现在这个方法有了四个截然不同的退出点,使得代码的维护异常艰难。自身没有任何的语义,尤其是,它代表的是在静态类型语言中以一种错误的方式对缺失变量值的建模。来表示变量值的缺失是大错特错的。它让你的代码充斥着深度嵌套的null检查,代码的可读性糟糕透顶。

2023-10-10 22:44:41 416

原创 Java8实战-总结39

在实际情况中,像这样的冲突可能极少发生,但是一旦发生这样的状况,必须要有一套规则来确定按照什么样的约定处理这些冲突。规则2说如果类或者父类没有对应的方法,那么就应该选择提供了最具体实现的接口中的方法。图的方式描述了出现这种问题的场景。这时规则2就无法进行判断了,因为从编译器的角度看没有哪一个接口的实现更加具体,两个都差不多。按照规则2,编译器会使用选择的是提供了最具体实现的默认方法的接口。方法,就会出现冲突,正如我们之前所介绍的,需要显式地指定使用哪个方法。方法,在它的方法体内显式地调用你希望调用的方法。

2023-10-09 22:54:40 140

原创 Java8实战-总结38

默认方法是Java 8中引入的一个新特性,希望能借此以兼容的方式改进API。现在,接口包含的方法签名在它的实现类中也可以不提供实现。缺失的方法实现会作为接口的一部分由实现类继承(所以命名为默认实现),而无需由实现类提供。那么,该如何辨识哪些是默认方法呢?其实非常简单。默认方法由default修饰符修饰,并像类中声明的其他方法一样包含方法体。比如,可以像下面这样在集合库中定义一个名为Sized的接口,在其中定义一个抽象方法size,以及一个默认方法isEmptyint size();//默认方法。

2023-10-08 23:34:49 109

原创 Java8实战-总结37

一旦接口发生变化,实现这些接口的类往往也需要更新,提供新添方法的实现才能适配接口的变化。其一,这增加了你作为类库的设计者维护类库的复杂度。其次,类库的用户不得不同时使用一套代码的两个版本,而这会增大内存的消耗,延长程序的载入时间,因为这种方式下项目使用的类文件数量更多了。它让类库的设计者放心地改进应用程序接口,无需担忧对遗留代码的影响,这是因为实现更新接口的类现在会自动继承一个默认的方法实现。向接口添加新方法是二进制兼容的,这意味着如果不重新编译该类,即使不实现新的方法,现有类的实现依旧可以运行。

2023-09-27 23:40:46 310

原创 Java8实战-总结36

程序失败时,会得到它的栈跟踪,通过一个又一个栈帧,可以了解程序失败时的概略信息。表达式有助于避免使用面向对象设计模式时容易出现的僵化的模板代码,典型的比如策略模式、模板方法、观察者模式、责任链模式,以及工厂模式。注意,如果方法引用指向的是同一个类中声明的方法,那么它的名称是可以在栈跟踪中显示的。那样恢复整个流的运行,而是在一个元素上完成操作之后,它只会将操作顺承到流水线中的下一个操作。的设计初衷就是在流的每个元素恢复运行之前,插入执行一个动作。流水线时,能将中间变量的值输出到日志中,是非常有用的工具。

2023-09-26 23:33:12 84

原创 Java8实战-总结35

比如,假定你为一家银行工作,他们需要一种方式创建不同的金融产品:贷款、期权、股票,等等。不得不提供不同的函数接口,无法采用之前统一使用一个简单接口的方式。接受函数作为参数的方法或者返回一个函数的方法(“高阶函数”,higher-order function)更难测试。但是,大多数时候,程序开发工作的要求并不是编写优美的代码,而是编写正确的代码。表达式,包含大量的业务逻辑,比如需要处理复杂情况的定价算法。函数,这种情况,可以利用这些字段,通过它们对封装在。的方法,把它当成一个函数接口,对它的功能进行测试。

2023-09-25 23:15:09 126

原创 Java8实战-总结34

想法很简单:好几家报纸机构,比如《纽约时报》《卫报》以及《世界报》都订阅了新闻,他们希望当接收的新闻中包含他们感兴趣的关键字时,能得到特别通知。但是,观察者的逻辑有可能十分复杂,它们可能还持有状态,抑或定义了多个方法,诸如此类。通常,这种模式是通过定义一个代表处理对象的抽象类来实现的,在抽象类中会定义一个字段来记录后续对象。一旦对象完成它的工作,处理对象就会将它的工作转交给它的后继。一个处理对象可能需要在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作,再转交给下一个处理对象,以此类推。

2023-09-24 23:19:52 429

原创 Java8实战-总结33

通常,用户需要输入一个用户账户,之后应用才能从银行的数据库中得到用户的详细信息,最终完成一些让用户满意的操作。不同分行的在线银行应用让客户满意的方式可能还略有不同,比如给客户的账户发放红利,或者仅仅是少发送一些推广文件。例如使用不同的条件(比如苹果的重量,或者颜色)来筛选库存中的苹果。可以将这一模式应用到更广泛的领域,比如使用不同的标准来验证输入的有效性,使用不同的方式来分析或者格式化输入。换句话说,模板方法模式在你“希望使用这个算法,但是需要对其中的某些行进行改进,才能达到希望的效果”时是非常有用的。

2023-09-22 00:07:43 180

原创 Java8实战-总结32

比如,下面的命令式代码使用了两种模式:筛选和抽取,这两种模式被混在了一起,这样的代码结构迫使程序员必须彻底搞清楚程序的每个细节才能理解代码的功能。如果你发现你需要频繁地从客户端代码去查询一个对象的状态(比如前文例子中的日志器的状态),只是为了传递参数、调用该对象的一个方法(比如输出一条日志),那么可以考虑实现一个新的方法,以。这种方式的好处是可以重用准备和清理阶段的逻辑,减少重复冗余的代码。你需要做的仅仅是延迟消息构造,如此一来,日志就只会在某些特定的情况下才开启(以此为例,当日志器的级别设置为。

2023-09-20 23:31:58 145

原创 Java8实战-总结31

你值得尝试的第一种重构,也是简单的方式,是将实现单一抽象方法的匿名类转换为Lambda表达式。采用Lambda表达式之后,你的代码会更简洁,可读性更好。改善代码的可读性到底意味着什么,我们很难定义什么是好的可读性,因为这可能非常主观。通常的理解是,“别人理解这段代码的难易程度”。为了确保你的代码能被其他人理解,有几个步骤可以尝试,比如确保你的代码附有良好的文档,并严格遵守编程规范。在这种方式下,应对需求的变化时,你的代码可以依据传入的参数动态选择和执行相应的行为。表达式,你可以写出更简洁、更灵活的代码。

2023-09-20 00:10:36 84

原创 Java8实战-总结30

一般而言,想给出任何关于什么时候该用并行流的定量建议都是不可能也毫无意义的,因为任何类似于“仅当至少有一千个(或一百万个或随便什么数字)元素的时候才用并行流)”的建议对于某台特定机器上的某个特定操作可能是对的,但在略有差异的另一种情况下可能就是大错特错。这段代码和指令式迭代数字列表的方式很像:初始化一个累加器,一个个遍历列表中的元素,把它们和累加器相加。这回方法的性能无关紧要了,唯一要紧的是每次执行都会返回不同的结果,都离正确值。中调用的方法有副作用,它会改变多个线程共享的对象的可变状态。

2023-09-19 00:02:13 93

原创 Java8实战-总结29

回到我们的数字求和练习,我们说过,在多核处理器上运行并行版本时,会有显著的性能提升。现在你有三个方法,用三种不同的方式(迭代式、顺序归纳和并行归纳)做完全相同的操作,让我们看看谁最快吧!

2023-09-17 23:13:27 80

原创 Java8实战-总结28

方法会返回一个供归约操作使用的函数,它定义了对流的各个子部分进行并行处理时,各个子部分归约所得的累加器要如何合并。方法必须返回在累积过程的最后要调用的一个函数,以便将累加器对象转换为整个集合操作的最终结果。集合,它定义了收集器的行为——尤其是关于流是否可以并行归约,以及可以使用哪些优化的提示。,因为累加器是原位更新,即函数的执行改变了它的内部状态以体现遍历的元素的效果。,在对空流执行操作的时候,这个空的累加器也代表了收集过程的结果。的收集操作,还有一种方法可以得到同样的结果而无需从头实现新的。

2023-09-15 00:23:43 153

原创 Java8实战-总结27

假设你要写一个方法,它接受参数int n,并将前n个自然数分为质数和非质数。分区是分组的特殊情况:由一个谓词(返回一个布尔值的函数)作为分类函数,它称分区函数。分区函数返回一个布尔值,这意味着得到的分组。类的静态工厂方法能够创建的所有收集器,并介绍了使用它们的实际例子。这里,对于分区产生的素食和非素食子流,分别按类型对菜肴分组,得到了一个二级。键的值:一个利用谓词,一个利用该谓词的非。创建的流作筛选,然后把结果收集到另外一个。上返回的类型,以及它们用于一个叫作。请注意,用同样的分区谓词,对菜单。

2023-09-13 22:46:33 303

原创 Java8实战-总结26

其目的是在累加之前对每个输入元素应用一个映射函数,这样就可以让接受特定类型元素的收集器适应不同类型的对象。来看看这个功能的第二个例子:假设要把菜单中的菜按照类型进行分类,有肉的放一组,有鱼的放一组,其他的都放另一组。,把分组函数返回的值作为映射的键,把流中所有具有这个分类值的项目的列表作为对应的映射值。在菜单分类的例子中,键就是菜的类型,值就是包含所有对应类型的菜肴的列表。如先前的示例所示,这个映射收集器将会收集分组函数生成的各个子流中的元素,让你得到这样的。这个收集器相当于旧收集器的一个包装,

2023-09-12 22:01:26 121

原创 Java8实战-总结25

到目前为止,已经看到了如何使用收集器来给流中的元素计数,找到这些元素数值属性的最大值和最小值,以及计算其总和和平均值。尽可能为手头的问题探索不同的解决方案,但在通用的方案里面,始终选择最专门化的一个。这个结果可以是任何类型,可以复杂如代表一棵树的多级映射,或是简单如一个整数——也许代表了菜单的热量总和。你还可以进一步简化前面使用reducing收集器的求和例子——引用Integer类的sum方法,而不用去写一个表达同一操作的Lambda表达式。继续探讨简单的预定义收集器,看看如何找到流中的最大值和最小值。

2023-09-11 23:11:18 171

原创 Java8实战-总结24

前一个例子清楚地展示了函数式编程相对于指令式编程的一个主要优势:只需指出希望的结果——“做什么”,而不用操心执行的步骤——“如何做”。在上一个例子里,传递给collect方法的参数是Collector接口的一个实现,也就是给Stream中元素做汇总的方法。toList只是说“按顺序给每个元素生成一个列表”;在本例中,groupingBy说的是“生成一个Map,它的键是(货币)桶,值则是桶中那些元素的列表”。

2023-09-11 00:20:27 218

原创 Java8实战-总结23

此操作将生成一个无限流——这个流没有结尾,因为值是按需计算的,可以永远计算下去。这是流和集合之间的一个关键区别。的方法引用)是无状态的:它不会在任何地方记录任何值,以备以后计算使用。可以创建存储状态的供应源,它可以修改状态,并在为流生成下一个值时使用。产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去。这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。的方法则是纯粹不变的:它没有修改现有状态,但在每次迭代时会创建新的元组。得到一个流,其中的每个元素都是给定文件中的一行。

2023-09-07 23:41:09 430

原创 Java8实战-总结22

要记住的是,这些特化的原因并不在于流的复杂性,而是装箱造成的复杂性——即类似。中的最大元素,就得换个法子了,因为0是错误的结果。让代码更为紧凑的一种可能的方法是,先生成所有的三元数。虽然更恰当的做法是定义一个新的类来表示三元数,但这里可以使用具有三个元素的。方法在做映射的同时,还会把所有生成的三元数流扁平化成一个流。方法计算流中元素的总和。每个接口都带来了进行常用数值归约的新方法,比如对数值流求和的。方法的工作方式一样,只是它们返回的是一个特化流,而不是。同样,一旦有了数值流,也可以把它转换回非特化流。

2023-09-06 22:34:02 219

原创 Java8实战-总结21

操作来表达更复杂的查询,比如“计算菜单中的总卡路里”或“菜单中卡路里最高的菜是哪一个”。此类查询需要将流中所有元素反复结合起来,得到一个值,比如一个。reduce操作还能把所有的数字相乘,而不必去复制粘贴这段代码,它对这种重复应用的模式做了抽象。),因为可以将这个操作看成把一张长长的纸(流)反复折叠成一个小方块,而这就是折叠操作的结果。操作会考虑新值和流中下一个元素,并产生一个新的最大值,直到整个流消耗完。到目前为止,归约的例子包含:对流求和、流中的最大值,或是流中元素的个数。,它成了新的累积值。

2023-09-05 23:17:41 112

原创 Java8实战-总结20

类()是一个容器类,代表一个值存在或不存在。在上面的代码中,findAny可能什么元素都没找到。Java 8的库设计人员引入了,这样就不用返回众所周知容易出问题的null了。先了解一下optional里面几种可以迫使你显式地检查值是否存在或处理值不存在的情形的方法。将在optional包含值的时候返回true,否则返回false。会在值存在的时候执行给定的代码块。T get()会在值存在时返回值,否则抛出一个异常。会在值存在时返回值,否则返回一个默认值。例如,在前面的代码中你需要显式地检查。

2023-09-04 22:54:30 139

原创 Java8实战-总结19

给定一个单词列表,想要返回另一个列表,显示每个单词中有几个字母。(使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”而不是去“修改”)。方法返回列表中每个单词的长度了。的确,你先是把每个单词转换成一个字母数组,然后把每个数组变成了一个独立的流。这是因为,你现在得到的是一个流的列表(更准确地说是。方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。首先,你需要一个字符流,而不是数组流。

2023-09-03 23:59:19 443

原创 Java8实战-总结18

流还支持skip(n)方法,返回一个扔掉了前n个元素的流。例如,下面的代码将跳过超过300卡路里的头两道菜,并返回剩下的。接下来,会看看一些特殊的流:数值流、来自文件和数组等多种来源的流,最后是无限流。的函数)作为参数,并返回一个包括所有符合谓词的元素的流。来看看如何选择流中的元素:用谓词筛选,筛选出各不相同的元素,忽略流中的头几个元素,或将流截短至指定长度。可以决定并行运行你的代码。可以看到,该方法只选出了符合谓词的头三个元素,然后就立即返回了结果。的方法,它会返回一个元素各异(根据流所生成元素的。

2023-09-01 00:14:08 1055

原创 Java8实战-总结17

第一,尽管很多菜的热量都高于300卡路里,但只选出了前三个。这是因为limit操作和一种称为短路的技巧,第二,尽管。下表总结了前面在代码例子中看到的中间流操作和终端流操作。等中间操作会返回另一个流。这是因为中间操作一般都可以合并起来,在终端操作时一次性全部处理。可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作。终端操作会从流的流水线生成结果。是两个独立的操作,但它们合并到同一次遍历中了。的终端操作,它会对源中的每道菜应用一个。流的流水线背后的理念类似于构建器模式。例如,在下面的流水线中,

2023-08-30 23:36:54 257

原创 Java8实战-总结16

同样的道理,内部迭代时,项目可以透明地并行处理,或者用更优化的顺序进行处理。可以从原始数据源那里再获得一个新的流来重新遍历一遍,就像迭代器一样(这里假设它是集合之类的可重复的源,如果是。库使用内部迭代——它帮你把迭代做了,还把得到的流值存在了某个地方,你只要给出一个函数说要干什么就可以了。而选择了外部迭代,那基本上就要自己管理所有的并行问题了(自己管理实际上意味着“某个良辰吉日我们会把它并行化”或“开始了关于任务和。已经说过了集合与流在概念上的差异,特别是流利用了内部迭代:替你把迭代做了。

2023-08-17 23:35:34 138

原创 PostgreSQL 执行更程中报错(### Error updating database. Corg.springframework.jdbc.BadSqlGrammarException: )

标签之间不能出现逗号,但写了逗号导致错误。注:这种错误排查起来很耗费时间,平时一定要注意。表在数据库中不存在,会导致错误,表中的字段如果不存在同理。一般出现这种错误提示说明程序写的有问题,通常是。语句中表名或访问的字段需要在数据库中存在,语句中各子句的顺序写错了,对应数据库表中的字段,

2023-08-14 23:12:11 1653

原创 Java8实战-总结15

要讨论流,先来谈谈集合,这是最容易上手的方式。Java 8中的集合支持一个新的stream方法,它会返回一个流(接口定义在里)。在后面会看到,还有很多其他的方法可以得到流,比如利用数值范围或从I/O资源生成流元素。流到底是什么?简短的定义就是“从支持数据处理操作的源生成的元素序列”。下面会一步步剖析这个定义。元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList与。

2023-08-09 23:22:08 125

原创 Java8实战-总结14

为了解释集合是怎么工作的,想象一下准备列出一系列菜,组成一张菜单,然后再遍历一遍,把每盘菜的热量加起来。接下来,会讨论如何创建和操纵数字流,比如生成一个偶数流,或是勾股数流。等操作是与具体线程模型无关的高层次构件,所以它们的内部实现可以是单线程的,也可能透明地充分利用多核架构。现在,从软件工程师的角度来看,新的方法有几个显而易见的好处。简单看看使用流的好处吧。下面两段代码都是用来返回低热量的菜肴名称的,并按照卡路里排序,一个是用。语言的设计者能做些什么,来帮助你节约宝贵的时间,让程序员活得轻松一点儿呢?

2023-08-08 23:45:23 185

原创 Java8实战-总结13

常见的一个问题就是,画在纸上之后函数下方的面积(把x轴作为基准)。无法摆脱“一切都是对象”的思想——它不能让函数完全独立。是一个线性函数(直线)。表达式只能用于接受函数式接口的地方(这里就是。确实,根据第一条原则需要一个方法,比如说叫。第一个问题是把积分号或。是包含静态方法f的一个类。顺便提一句,有点儿可惜的是必须写。之类的换成熟悉的编程语言符号。表达式和函数传递的思想。,它接受三个参数:一个是。里就是下面这个样子,函数。假设有一个(数学,不是。

2023-08-07 00:01:04 96

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除