《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

Option

Java8的Optional

public String getCarInsuranceName(Optional person, int minAge) {

return person.filter(p -> p.getAge() >= minAge)

.flatMap(Person::getCar)

.flatMap(Car::getInsurance)

.map(Insurance::getName)

.orElse(“Unknown”);

}

在Scala语言中,你可以使用Option使用Optional类似的方法实现该函数:

def getCarInsuranceName(person: Option[Person], minAge: Int) = person.filter(_.getAge() >= minAge)

.flatMap(_.getCar)

.flatMap(_.getInsurance)

.map(_.getName).getOrElse(“Unknown”)

函数


Scala中的一等函数

def isJavaMentioned(tweet: String) : Boolean = tweet.contains(“Java”)

def isShortTweet(tweet: String) : Boolean = tweet.length() < 20

Scala语言中,你可以直接传递这两个方法给内嵌的filter,如下所示

val tweets = List(

“I love the new features in Java 8”,

“How’s it going?”,

“An SQL query walks into a bar, sees two tables and says ‘Can I join you?’”

)

tweets.filter(isJavaMentioned).foreach(println)

tweets.filter(isShortTweet).foreach(println)

现在,让我们一起审视下内嵌方法filter的函数签名:

def filter[T](p: (T) => Boolean): List[T]

匿名函数和闭包

匿名函数

val isLongTweet : String => Boolean

= (tweet : String) => tweet.length() > 60

val isLongTweet : String => Boolean

= new Function1[String, Boolean] {

def apply(tweet: String): Boolean = tweet.length() > 60

}

isLongTweet.apply(“A very short tweet”)

如果用Java,你可以采用下面的方式:

Function<String, Boolean> isLongTweet = (String s) -> s.length() > 60;

boolean long = isLongTweet.apply(“A very short tweet”);

isLongTweet(“A very short tweet”)


闭包

闭包是一个函数实例,它可以不受限制地访问该函数的非本地变量。不过Java 8中的Lambda表达式自身带有一定的限制:它们不能修改定义Lambda表达式的函数中的本地变量值。这些变量必须隐式地声明为final。

Scala中的匿名函数可以取得自身的变量,但并非变量当前指向的变量值。

def main(args: Array[String]) {

var count = 0

val inc = () => count+=1

inc()

println(count)

inc()

println(count)

}

不过在Java中,下面的这段代码会遭遇编译错误,因为count隐式地被强制定义为final:

public static void main(String[] args) {

int count = 0;

Runnable inc = () -> count+=1;//错误:count必须为final或者在效果上为final

inc.run();

System.out.println(count);

inc.run();

}

科里化

Java的示例

static int multiply(int x, int y) {

return x * y;

}

int r = multiply(2, 10);

static Function<Integer, Integer> multiplyCurry(int x) {

return (Integer y) -> x * y;

}

Stream.of(1, 3, 5, 7)

.map(multiplyCurry(2))

.forEach(System.out::println);

Scala提供了一种特殊的语法可以自动完成这部分工作。

def multiply(x : Int, y: Int) = x * y

val r = multiply(2, 10);

该函数的科里化版本如下:

def multiplyCurry(x :Int)(y : Int) = x * y

val r = multiplyCurry(2)(10)

val multiplyByTwo : Int => Int = multiplyCurry(2)

val r = multiplyByTwo(10)

类和trait


更加简洁的Scala类

由于Scala也是一门完全的面向对象语言,你可以创建类,并将其实例化生成对象。

class Hello {

def sayThankYou(){

println(“Thanks for reading our book”)

}

}

val h = new Hello()

h.sayThankYou()

getter方法和setter方法

单纯只定义字段列表的Java类,你还需要声明一长串的getter方法、setter方法,以及恰当的构造器。多麻烦啊!

public class Student {

private String name;

private int id;

public Student(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

Scala语言中构造器、getter方法以及setter方法都能隐式地生成,从而大大降低你代码中的冗余:

class Student(var name: String, var id: Int)

val s = new Student(“Raoul”, 1)

println(s.name)

s.id = 1337

println(s.id)

Scala的trait与Java8的接口对比

Scala还提供了另一个非常有助于抽象对象的特性,名称叫trait。它是Scala为实现Java中的接口而设计的替代品。trait中既可以定义抽象方法,也可以定义带有默认实现的方法。trait同时还支持Java中接口那样的多继承,所以你可以将它们看成与Java 8中接口类似的特性,它们都支持默认方法。trait中还可以包含像抽象类这样的字段,而Java 8的接口不支持这样的特性。

trait Sized{

var size : Int = 0

def isEmpty() = size == 0

}

class Empty extends Sized//一个继承自trait Sized的类

println(new Empty().isEmpty())//打印输出true

你可以创建一个Box类,动态地决定到底选择哪一个实例支持由trait Sized定义的操作

class Box

val b1 = new Box() with Sized //在对象实例化时构建trait

println(b1.isEmpty()) //打印输出true

val b2 = new Box()

b2.isEmpty() //编译错误:因为Box类的声明并未继承Sized

小结


  • Java 8和Scala都是整合了面向对象编程和函数式编程特性的编程语言,它们都运行于JVM之上,在很多时候可以相互操作。
  • Scala支持对集合的抽象,支持处理的对象包括List、Set、Map、Stream、Option,这些和Java 8非常类似。不过,除此之外Scala还支持元组。

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

[外链图片转存中…(img-Ct7YvcpF-1715473619391)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值