The method of map in Java instead of Scala

用Java实现Scala中map方法

具体需求:

操作一个字符串集合中的元素,加入一段字符串或者是将小写字母改成大写字母。…

需求的引出

理清scala中map方法实现的过程,函数编程思想与java面向对象编程思想的对比。通过Java模仿函数式编程,充分把握到scala的优势。

思考过程

熟悉scala中map方法的使用

1
2
3
4
scala> val arr = Array("Spark", "Hadoop", "Scala", "Hbase", "Flink")
arr: Array[String] = Array(Spark, Hadoop, Scala, Hbase, Flink)
scala> arr.map(x => x.toUpperCase + "2.0")
res1: Array[String] = Array(SPARK2.0, HADOOP2.0, SCALA2.0, HBASE2.0, FLINK2.0)

scala中的集合调用map方法,循环操作集合中的元素。map方法是在进行”做映射”的操作。所谓”映射”,即是指两个集合中的元素有了一一对应的关系。数学知识牵引:函数y=f(x)就存在着一种映射关系,一个x的值就会有一个y值与之对应。我将x => f(x)用数学中函数的思想来理解的话,结合当前情景,数组调用了map方法,map方法制造了一种映射关系:依次传入集合中的元素(相当于x)到函数式x.toUpperCase + "2.0"中进行”_运算_”,结果放进了新的数组里。arr2 = f(arr1),两个集合中的对应元素见存在的映射关系。

用scala实现wordcount的功能更容易

统计单词出现的次数

1
2
3
4
scala> val arr = Array("i believe i can fly", "i can fly high", "just fly as you can", "believe youself")
arr: Array[String] = Array(i believe i can fly, i can fly high, just fly as you can, believe youself)
scala> arr.flatMap(_.split(" ")).groupBy(x => x).mapValues(_.length).toList.sortBy(-_._2)
res2: List[(String, Int)] = List((i,3), (can,3), (fly,3), (believe,2), (just,1), (as,1), (you,1), (high,1), (youself,1))

Java实现map(x => x.toUpperCase + “2.0”)

map中传入我们想要实现的逻辑语句,对外不要求理会底层代码是如何实现的。Java中面向对象的思想:明确操作对象,细化逻辑实现过程(面向过程),面向对象是对过程进行了封装,便于编程人员着重于业务逻辑编程上。

明确需求–>设计接口–>实现抽象方法–>实例化对象–>调用方法–>实现需求

对象是集合:封装一个集合类MyList,将传入的逻辑函数设计为一个接口MapFunction

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.masato;
import java.util.ArrayList;
import java.util.List;
public class MyList {
//操作一个集合中的元素,产生了新的集合
private List<String> oldList;
public MyList(List<String> list) {
this.oldList = list;
}
//定义类似于scala中的map方法:map(传入逻辑)-->实现需求
public List<String> map(MapFunction func) {
//生成新的集合,用于存放旧集合操作后的元素
List<String> newList = new ArrayList<>();
for(String word : oldList) {
//传入的逻辑参数调用自定义接口中的抽象方法(具体实现需要关联传入参数有关)
String newWord = func.transform(word);
newList.add(newWord);
}
return newList;
}
}

####

1
2
3
4
package com.masato;
public interface MapFunction {
public String transform(String word);
}

####

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.masato;
import java.util.Arrays;
import java.util.List;
public class TestMyList {
public static void main(String[] args) {
String[] words = {"Spark", "Hadoop", "Flink", "Hbase"};
List<String> wordlist = Arrays.asList(words);
MyList myList = new MyList(wordlist);
//1、匿名实现类
/*
List<String> nList = myList.map(new MapFunction() {
@Override
public Stringtransform(String word) {
return word.toUpperCase() + "2.0";
}
});
*/

//2、创建传入map中的逻辑函数的对象,实现方法

MapFunction myFunc = new MapFunction() {
@Override
public String transform(String word) {
return word.toUpperCase() + "2.0";
}
};
List<String> nList = myList.map(myFunc);

//3、使用Lambdas表达式(1.8以后)
//List<String> nList = myList.map(word -> word.toUpperCase() + "2.0");
//遍历新集合中的元素,依次打印到控制台
for (String s : nList) {
System.out.println(s);
}
}
}

####

To be continue…

0%