www.4688.comjava8-lamba表明式的应用-遁地龙卷风

(-1)前言

(-1)写在面前

这么些图形是自我从网上下载的,向这位长辈致敬。图片资源在自己的百度云盘里。http://pan.baidu.com/s/1nvfJHdZ

自我用的是chrome49,JQuery3.0,案例并没有考虑浏览器兼容问题,假若你看不到动画效果,尝试给css属性加上前缀。

  学习lamba表明式是十分生死攸关的,你会发现java变的可爱多了。

(1)知识储备

(0)函数式接口

a.class

假如为class标记指定四个值,例如class=”dnf lol” dnf
lol是从未有过先后观念的,等同于class=”lol
dnf”,lol中的样式是否能够覆盖dnf中的样式,取决于css样式表中lol是否在dnf前面。不同属性附加。

  只有一个办法的接口称为函数式接口

b.id、 classs

一个因素既有id标记又有class标记,那么同样样式id覆盖class,不同样式附加。

  JButton jButton = new JButton(“123”);

(2)关键思想

要素低度的变更是在本来class A的基础上扩展或移除class
B实现的,在A和B中应用了transition属性。

  jButton.addActionListener(new ActionListener() {

(3)源代码

<!DOCTYPE html>

<html lang=”en”>

<head>

<meta charset=utf-8>

<script  type=”text/javascript”
src=”debug-jquery-3.0.0.js”></script>

<link rel=”shortcut icon” href=”favicon.ico” type=”image/x-icon”>

<title>为了生活</title>

<style type=”text/css”>

      *

      {

           margin:0;

           padding:0;

      }

      .slider

      {

           width:700px;

           height:32px;

           overflow:hidden;

           transition:height 150ms linear 0s;

           background:#00FF66;

      }

      .slider p

      {

           width:700px;

           cursor:pointer;

           height:32px;

           background-image:url(“images/newsclosedbg.gif”);

      }

      .big

      {

           height:200px;

           transition:height 150ms linear 0s;

      }

</style>    

<script type=”text/javascript”>

      $(function()

      {

           $(“.slider p”).click(function()

           {

                 var $parent = $(this.parentNode),

                      target =  this;

                 $parent.toggleClass(function(index,css)

                            {

                                  if(css.indexOf(“big”) != -1)

                                  {

                                       target.style.backgroundImage =
‘url(“images/newsclosedbg.gif”)’;

                                  }

                                  else

                                  {

                                       target.style.backgroundImage =
‘url(“images/newsopenbgtop.gif”)’;

                                  }

                                  return “big”

                           
}).siblings().removeClass(function(index,css)

                            {

                                 
this.children[0].style.backgroundImage =
‘url(“images/newsclosedbg.gif”)’;

                                  return “big”;

                            });

           }).eq(0).click();

      })

</script>

</head

<body>

      <div class=”slider”>

           <p></p>

      </div>

      <div class=”slider” >

           <p></p>

      </div>

      <div class=”slider” >

           <p></p>

      </div>

      <div class=”slider” >

           <p></p>

      </div>

</body>              

</html>                 

                        

                         

 

  @Override

  public void actionPerformed(ActionEvent e) {}});

等同于

  jButton.addActionListener(e->System.out.println(“Hello world”));

  jButton.addActionListener((e)->System.out.println(“Hello
world”));

  jButton.addActionListener((ActionEvent
e)->System.out.println(“Hello world”));

  jButton.addActionListener((ActionEvent
e)->{System.out.println(“Hello world”);return;});

a.规则

  A->B

  A 部分是传播方法的参数

  B 部分是函数体

  参数类型以及重回类型假诺得以经过上下文预计出来可不写

   当参数只有一个同时它的档次可以被演绎得知时,该参数列表外面的括号可以被概括

   当函数体只有一个语句且重回类型可被演绎时**{}可省略**

b.例子

  Runnable runnable = ()->System.out.println(sign);

  Runnable runnable2 = new Runnable() {

  @Override

  public void run() {

  // TODO Auto-generated method stub}

  };

  通过匿名内部类我们领略**run方法是不需要参数的**

  System.out.println(sign) 相当于run方法的方法体

 

  Comparator<Integer> lol = (x,y)->x-y;

  Comparator<Integer> lol =
(x,y)->{System.out.println(x+y);return x-y;};

  new Comparator<Integer>() {

  @Override

  public int compare(Integer o1, Integer o2) {

  // TODO Auto-generated method stub

  return 0;

  }

};

透过匿名内部类我们通晓compare方法需要两个参数

此刻编译通过Comparator<Integer>中Integer推导出参宿类型及重返类型

c.深入

  lamba表明式可被看作函数,java.util.function定义了常用的函数式接口

  http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

 

  BiFunction<T,U,R>

  T 代表首先个参数

  U 代表第二个参数

  R 代表重回值

  这表时T,U,R都需要编译器按照上下文举办项目推导

  Consumer<T>  代表e->System.out.println(“Hello
world”)

  所以当一个主意需要的是lamba表明式时,参数显示形式是java.util.function中定义的样式

(2)方法引用

  方法引用是对拉姆a表明式的简化

  类名::方法名(对象方法、类格局)

  int[] oop = {3,1,2,1};

  static void sayHello(Integer name)

  {

  System.out.println(123);

  }

  Arrays.stream(oop).forEach(Test::sayHello);

  Arrays.stream(oop).forEach(s->Test.sayHello(s));

  构造方法引用:Class::new

  数组构造方法引用:TypeName[]::new

(3)强制类型转换

  有时候编译器通过上下文推导出的归来类型与事实上类型不符时需要进类型转换

  Stream<Object> strings =
shapelist.stream().<Object>map(s->s.getColor());

  s.getColor())

  s.getColor()重返的是String

(4)lamba表达式在java对象中的应用

您应该在其他java对象中品尝利用lamba表明式,通则是将那一个目标转换成java.util.stream,流有串行并行之分哦!并行流关键字parallelStream

数组   Arrays.stream()

List、Set   .stream()   

String  String.chars

java.util.stream提供了许多办法用来操作流中的数据,去试一试吧

http://docs.oracle.com/javase/8/docs/api/

java 8英文API,没有找到普通话的…

(2)对流全部的操作

比如大家得以求一个流的的总和

int sum = Arrays.stream(oop).sum();

int sum1 = Arrays.stream(oop).reduce(0,(x,y)->x+y);

(3)集合之间的转移

  我们得以将ArrayList<Shape>
转换成ArrayList<String>、Set<String>、HashMap<String,String>,HashMap<String,Shape>甚至是更复杂的

a.map()

  该措施是炫耀的意味(一方始我联想到了HashMap),还有mapToDouble等

b.collect()

  collect()接受Collectors类型的参数,用来将流重新合并,

  Collectors是收集器,Collectors.toList(),Collectors.toMap()、Collectors.groupingBy等

c.例子

  public class Shape

  {

  private String color;

  public Shape() {

  // TODO Auto-generated constructor stub

  }

  public String getColor() {

  return color;

  }

  public void setColor(String color) {

  this.color = color;

  }

  public Shape(String color)

  {

  this.color = color;

  }

  }

 

  ArrayList<String> colorList = new ArrayList<String>(){

  {

  add(“Red”);

  add(“Blue”);

  add(“Yellow”);

  }

  };

  List<Shape> shapeList =
colorList.stream().map(Shape::new).collect(Collectors.toList());

  List<String> colos =
shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList());

  Set<String> colosSet =
shpaeList.stream().map(s->s.getColor()).collect(Collectors.toSet());

  Map<String, String> colorMap =
colorList.stream().collect(Collectors.toMap(a->a,s->s));

  Map<String,Shape> shapesMap =
shpaeList.stream().collect(Collectors.toMap(s->s.getColor(),
s->s));

  Eclipse点不出getColor()方法,还认为用法不对…

  Map<String,Set<Shape>> shapeMapSet =
shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet()));

  Map<String,Map<String, List<Shape>>> shapeMap3 =
shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.groupingBy(s->s.getColor(),Collectors.toList())));

(4)集合本身的操纵

  想要改变现有集合而不爆发新的聚众可以动用

  Iterable.forEach(Consumer),Collection.removeAll(Predicate),List.replaceAll(UnaryOperator),List.sort(Comparator)和Map.computeIfAbsent()等

  shpaeList.sort(Comparator.comparing(Shape::getColor));

(5)好文推荐

  我读了四次

  http://www.cnblogs.com/figure9/archive/2014/10/24/4048421.html

 

  http://www.cnblogs.com/GYoungBean/p/4301557.html

 

  第三篇没有找到,这位小伙伴提供下!

 

 www.4688.com 1

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website