Java教程:一文详解函数式编程

article/2025/11/5 20:19:55

看懂了这篇-你就懂了函数式接口

​ 函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数式接口。现在很多公司都在使用lambda表达式进行代码编写,甚至知名的Java的插件也都在Lambda,比如数据库插件MybatisPlus。Lambda表达式的使用是需要函数式接口的支持,即lambda表达式的核心就是使用大量的函数式接口。本文带领大家全面了解函数式接口的定义和使用。

一、文章导读

  • 函数式接口概述
  • 自定义函数式接口
  • 常用函数式接口
  • 函数式接口的练习

二、函数式接口概述

1.函数式接口定义

如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。

注意事项

函数式接口里可以定义默认方法:默认方法有方法体,不是抽象方法,符合函数式接口的定义要求。
函数式接口里可以定义静态方法:静态方法也不是抽象方法,是一个有具体方法实现的方法,同样也符合函数式接口的定义的。
函数式接口里可以定义Object里的public方法(改成抽象方法):虽然它们是抽象方法,却不需要覆盖重写,因为所有接口的实现类都是Object类的子类,而在Object类中有这些方法的具体的实现。

2.函数式接口格式

修饰符 interface 接口名称 {//抽象方法public abstract 返回值类型 方法名称(可选参数信息);//默认方法public default 返回值类型 方法名称(可选参数信息) {//代码...        }//静态方法public static 返回值类型 方法名称(可选参数信息) {//代码...        }//Object类的public方法变成抽象方法public abstract boolean equals(Object obj);public abstract String toString();    
}

三、自定义函数式接口

1.自定义函数式接口举例

由于接口当中抽象方法的public abstract是可以省略的,所以定义一个函数式接口很简单:

@FunctionalInterface
public interface MyFunctionalInterface {//抽象方法public abstract void method();//Object类的public方法变成抽象方法public abstract boolean equals(Object obj);public abstract String toString();//默认方法public default void show(String s) {//打印小写System.out.println(s.toLowerCase());}//静态方法public static void print(String s) {//打印大写System.out.println(s.toUpperCase());}
}

2.自定义函数式接口的应用

对于刚刚定义好的MyFunctionalInterface函数式接口,典型使用场景就是作为方法的参数:

public class Demo01FunctionalInterface {public static void main(String[] args) {// 调用使用函数式接口的方法show(()->{System.out.println("Lambda执行了");});}//定义方法使用函数式接口作为参数public static void show(MyFunctionalInterface mfi) {//调用自己定义的函数式接口mfi.method();String s = mfi.toString();System.out.println(s);boolean result = mfi.equals(mfi);System.out.println(result);mfi.show("world");MyFunctionalInterface.print("function");}
}

3.运行结果:

Lambda执行了
Demo01FunctionalInterface$$Lambda$1/1078694789@3d075dc0
true
world
FUNCTION

四、常用函数式接口

前面我们自己定义了一个函数式接口,对于一些常用的函数式接口,每次自己定义非常麻烦。JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在`java.util.function`包中被提供。这样的接口有很多,下面是最简单的几个接口及使用示例。

1. Supplier接口

java.util.function.Supplier<T>接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

1.1.抽象方法 : get

Supplier`接口中包含一个抽象方法` T get(): 用来获取一个泛型参数指定类型的对象数据。	
public class Demo02Supplier {public static void main(String[] args) {int num = getNum(() -> {return new Random().nextInt();});System.out.println(num);}public static int getNum(Supplier<Integer> supplier) {int num = supplier.get();return num;}
}

1.2.求集合元素最大值

使用Supplier接口作为方法参数类型,通过Lambda表达式求出List集合(存储int数据)中的最大值。提示:接口的泛型请使用java.lang.Integer类。

代码示例:

public class Demo03Supplier {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Collections.addAll(list,10,8,20,3,5);printMax(()->{return Collections.max(list);});}private static void printMax(Supplier<Integer> supplier) {int max = supplier.get();System.out.println(max);}
}

2. Consumer接口

java.util.function.Consumer<T>接口则正好相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。

2.1.抽象方法:accept

Consumer接口中包含抽象方法void accept(T t): 消费一个指定泛型的数据。

代码示例:

import java.util.function.Consumer;
//接收一个输入参数x,把x的值扩大2倍后,再+3做输出
//类似于数学中的函数: f(x) = 2*x + 3
public class Demo04Consumer {public static void main(String[] args) {int x = 3;consumeIntNum(x,(Integer num)->{System.out.println(2*num+3);});}/*定义方法,使用函数式接口Consumer作为方法参数*/private static void consumeIntNum(int num,Consumer<Integer> function ) {function.accept(num);}
}

2.2.默认方法:andThen

如果一个方法的参数和返回值全都是Consumer类型,那么就可以实现效果:消费一个数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是Consumer接口中的default方法andThen。下面是JDK的源代码:

default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };
}

备注:java.util.ObjectsrequireNonNull静态方法将会在参数为null时主动抛出NullPointerException异常。这省去了重复编写if语句和抛出空指针异常的麻烦。
andThen是默认方法,由Consumer的对象调用,而且参数和返回值都是Consumer对象

要想实现组合,需要两个或多个Lambda表达式即可,而andThen的语义正是“一步接一步”操作。例如两个步骤组合的情况:

代码示例:

//接收一个字符串,先按照大写打印,再按照小写打印
/*toUpperCase(): 把字符串变成大写toLowerCase(): 把字符串变成小写*/
public class Demo05Consumer {public static void main(String[] args) {String s = "Hello";//lambda标准格式fun(s, (String str) -> {System.out.println(s.toUpperCase());}, (String str) -> {System.out.println(s.toLowerCase());});}/*定义方法,参数是Consumer接口因为要消费两次,所以需要两个Consumer接口作为参数*/public static void fun(String s, Consumer<String> con1, Consumer<String> con2) {//先消费一次con1.accept(s);//再消费一次con2.accept(s);}
}

运行结果将会首先打印完全大写的HELLO,然后打印完全小写的hello。但是我们却没有使用andThen方法,其实我上面的写法,就是andThen底层的代码实现。

为了方便大家理解,下面我们使用andThen方法进行演示。

public class Demo06Consumer {public static void main(String[] args) {String s = "HelloWorld";//2.lambda标准格式fun(s, (String str) -> {System.out.println(s.toUpperCase());}, (String str) -> {System.out.println(s.toLowerCase());});}/*定义方法,参数是Consumer接口因为要消费两次,所以需要两个Consumer接口作为参数*/public static void fun(String s, Consumer<String> con1, Consumer<String> con2) {con1.andThen(con2).accept(s);}
}

运行结果将会首先打印完全大写的HELLO,然后打印完全小写的hello。

andThen原理分析图解:

在这里插入图片描述

注意:1.con1调用andThen方法,传递参数con2,所以anThen方法内部的this就是con1,after就是con22.andThen方法内部调用accept方法,前面隐藏了一个this,this代表调用andThen方法的对象,就是con13.andThen方法内部的t是谁?就是最后调用方法accept传递的sthis.accept(t) <==> con1.accept(s)   ①4.con1调用andThen方法时传递的参数是con2,所以andThen方法内部的after就是con2after.accept(t) <==> con2.accept(s)  ②5.通过分析,我们发现①和②中的内容,就是之前不用andThen方法,自己进行调用的过程6.以上分析,仍然是按照面向对象中方法调用的思路展开的,但实质上,我们要注意,Consumer接口中的andThen方法,返回的是一个Consumer,里面采用的是lambda表达式,其实是在做函数模型的拼接,把两个函数模型con1和con2拼接出一个新的模型,返回新的模型。所以con1.andThen(con2)是把con1和con2拼接成一个新的Consumer,返回的是lambda表达式的形式最后调用accept(s)方法时,其实执行的是lambda表达式{}中的代码

3. Function接口

java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。

3.1.抽象方法:apply

Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。

代码示例:

String类型转换为Integer类型。

/*java.util.function.Function<T,R>: 转换型接口泛型T: 转换前的类型泛型R: 转换后的类型抽象方法:R apply(T t): 根据类型T的参数获取类型R的结果 把参数t转换成R类型的结果"123" --> 123需求:给你一个String类型的数字,给我转换成int数字分析:用Function接口T: 转换前的类型, StringR: 转换后的类型, Integer*/
public class Demo07Function {public static void main(String[] args) {String s = "123";//lambda标准格式fun(s,(String str)->{return Integer.parseInt(str);});}/*定义方法,使用Function接口作为参数*/public static void fun(String s,Function<String,Integer> function) {Integer num = function.apply(s);System.out.println(num);}
}

3.2.默认方法:andThen

Function接口中有一个默认的andThen方法,用来进行组合操作。JDK源代码如:

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));
}

该方法同样用于“先做什么,再做什么”的场景,和Consumer中的andThen差不多:

代码示例:

将String的数字,转成int数字,再把int数字扩大10倍

/*java.util.function.Function<T,R>: 转换型接口泛型T: 转换前的类型泛型R: 转换后的类型默认方法:default <V> Function<T, V> andThen(Function<R, V> after):先转换一次,再转换一次,一个挨着一个"123" --> 123 --> 1230 (扩大了10倍)需求:给你一个String类型的数字,给我转先换成int数字再给我把int数字扩大10倍分析:用2个Function接口第一个Function接口T: 转换前的类型, StringR: 转换后的类型, Integer第二个Function接口:T: 转换前的类型, IntegerR: 转换后的类型, Integer*/
public class Demo08Function {public static void main(String[] args) {String s = "123";//lambda标准格式fun(s,(String str)->{return Integer.parseInt(str);},(Integer num) -> {return num*10;});        }/*定义一个方法,有两个Function接口作为参数*/public static void fun(String s,Function<String,Integer> fun1,Function<Integer,Integer> fun2) {//1.先转换一次Integer num1 = fun1.apply(s);//2.再转换一次Integer num2 = fun2.apply(num1);System.out.println(num2);        }
}

第一个操作是将字符串解析成为int数字,第二个操作是乘以10。两个操作通过andThen按照前后顺序组合到了一起。运行结果将会打印1230。但是我们却没有使用andThen方法,其实我上面的写法,就是andThen底层的代码实现。

请注意,Function的前置条件泛型和后置条件泛型可以相同。

为了方便大家理解,下面我们使用andThen方法进行演示

public class Demo09Function {public static void main(String[] args) {String s = "123";//lambda标准格式fun(s,(String str)->{return Integer.parseInt(str);},(Integer num) -> {return num*10;});}/*定义一个方法,有两个Function接口作为参数*/public static void fun(String s,Function<String,Integer> fun1,Function<Integer,Integer> fun2) {Integer num3 = fun1.andThen(fun2).apply(s);System.out.println(num3);}
}

运行结果仍然是1230。

andThen原理分析图解:
在这里插入图片描述

注意:1.fun1调用andThen方法传递参数fun2,所以andThen方法内部的this就是fun1,after就是fun22.andThen方法内部直接调用apply方法,前面隐藏了一个this,this代表调用andThen方法的对象,就是fun13.andThen方法内部的t是谁?就是最后调用方法apply传递的sthis.apply(t) <==> Integer num1 = fun1.apply(s) ①4.fun1调用andThen方法时传递的参数是fun2,所以andThen方法内部的after就是fun2after.apply(this.apply(t)) <==> Integer num2 = fun2.apply(num1)  ②5.通过分析,我们发现①和②中的内容,就是之前不用andThen方法,我们自己进行调用的过程6.以上分析,仍然是按照面向对象中方法调用的思路展开的,但实质上,我们要注意,Function接口中的andThen方法,返回的是一个Function,里面采用的是lambda表达式,其实是在做函数模型的拼接,把两个函数模型fun1和fun2拼接出一个新的模型,返回新的模型。所以fun1.andThen(fun2)是把fun1和fun2拼接成一个新的Function,返回的是lambda表达式的形式最后调用accept(s)方法时,其实执行的是lambda表达式{}中的代码

4. Predicate接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate<T>接口。

4.1.抽象方法:test

Predicate接口中包含一个抽象方法:boolean test(T t)。用于条件判断的场景:

//1.练习:判断字符串长度是否大于5
//2.练习:判断字符串是否包含"H"
public class Demo10Predicate {public static void main(String[] args) {String str = "helloWorld";//1.练习:判断字符串长度是否大于5//lambda标准格式fun(str,(String s)->{return s.length()>5;});System.out.println("-----------------");//2.练习:判断字符串是否包含"H"//lambda标准格式fun(str,(String s)->{return s.contains("H");});}/*定义一个方法,参数是Predicate接口*/public static void fun(String s,Predicate<String>predicate) {boolean result = predicate.test(s);System.out.println(result);}
}

条件判断的标准是传入的Lambda表达式逻辑,只要字符串长度大于5则认为很长。

4.2.默认方法:and

既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个Predicate条件使用“与”逻辑连接起来实现“并且”的效果时,可以使用default方法and。其JDK源码为:

default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);
}

代码示例:

判断一个字符串既要包含大写“H”,又要包含大写“W”

public class Demo11Predicate {public static void main(String[] args) {String str = "HelloWorld";//1.练习:判断一个字符串既要包含大写“H”,又要包含大写“W”//lambda标准格式fun1(str,(String s)->{return s.contains("H");},(String s)->{return s.contains("W");});System.out.println("------------");fun2(str,(String s)->{return s.contains("H");},(String s)->{return s.contains("W");});}/*演示and方法需要两个Predicate作为参数fun1方法没有使用and方法,就是p1和p2分别调用test方法,然后把结果进行&&运算--其实这是and方法的底层实现*/public static void fun(String s,Predicate<String> p1,Predicate<String> p2) {//先判断一次boolean result1 = p1.test(s);//再判断一次boolean result2 = p2.test(s);//进行&&运算boolean result = result1&&result2;System.out.println(result);       }/*演示and方法需要两个Predicate作为参数*/public static void fun2(String s,Predicate<String> p1,Predicate<String> p2) {boolean result = p1.and(p2).test(s);System.out.println(result); }
}

4.3.默认方法:or

and的“与”类似,默认方法or实现逻辑关系中的“”。JDK源码为:

default Predicate<T> or(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);
}

代码示例:

字符串包含大写H或者包含大写W”

public class Demo12Predicate {public static void main(String[] args) {String str = "Helloworld";//1.练习:判断一个字符串包含大写“H”或者包含大写“W”//lambda标准格式fun1(str,(String s)->{return s.contains("H");},(String s)->{return s.contains("W");});System.out.println("------------");fun2(str,(String s)->{return s.contains("H");},(String s)->{return s.contains("W");});}/*演示or方法需要两个Predicate作为参数fun1方法没有使用or方法,就是p1和p2分别调用test方法,然后把结果进行||运算--其实这是or方法的底层实现*/public static void fun(String s,Predicate<String> p1,Predicate<String> p2) {//先判断一次boolean result1 = p1.test(s);//再判断一次boolean result2 = p2.test(s);//进行||运算boolean result = result1||result2;System.out.println(result);       }/*演示or方法需要两个Predicate作为参数*/public static void fun2(String s,Predicate<String> p1,Predicate<String> p2) {boolean result = p1.or(p2).test(s);System.out.println(result); }
}

关于and和or方法的原理,可以参考andThen方法原理

4.4.默认方法:negate

“与”、“或”已经了解了,剩下的“非”(取反)也会简单。默认方法negate的JDK源代码为:

default Predicate<T> negate() {return (t) -> !test(t);
}

从实现中很容易看出,它是执行了test方法之后,对结果boolean值进行“!”取反而已。一定要在test方法调用之前调用negate方法,正如andor方法一样:

import java.util.function.Predicate;public class Demo13Predicate {private static void method(Predicate<String> predicate,String str) {boolean veryLong = predicate.negate().test(str);System.out.println("字符串很长吗:" + veryLong);}public static void main(String[] args) {method(s -> s.length() < 5, "Helloworld");}
}

五、总结

本文通过具体的例子,演示了函数式接口的定义和使用。以及常用的函数式接口。并给出了相关的练习题目。对于部分函数式接口中的默认方法,进行了图解分析,让你更加深刻的理解函数式接口的思想和目的。在以后实际的编程过程中,对于集合的操作,可以通过Stream流完成,而Stream流中的很多方法的参数都是函数式接口,通过本文的学习,你已经掌握了函数式接口的使用,相信后面学习Stream流是非常容易的。


http://chatgpt.dhexx.cn/article/L0eqdtSk.shtml

相关文章

java中的函数式编程(一)

当你安安稳稳的学着java&#xff0c;慢慢开始写代码。 兢兢业业&#xff0c;本着面向对象的编程方式。 知道有一种叫做“面向过程”的方式&#xff0c;但是你不在意。 写了一段时间后有人告你&#xff0c;函数式编程很爽&#xff01; 你也看到了他给的一个实例&#xff0c;看着…

Java函数式编程(基础):第一部分

1.函数式编程有三个部分&#xff1a; 第一个部分是&#xff1a;Lambda表达式 第二个部分是&#xff1a;方法引用 第三个部分是&#xff1a;函数式接口 刚接触Lambda表达式的我&#xff0c;觉得它很神奇&#xff0c;能够用简短的代码&#xff0c;代替传统的编程方式 举一个简…

java-函数式编程浅谈

了解函数式编程的实际应用场景以及优点。 文章目录 什么是函数式编程函数式编程的使用原理解析 什么是函数式编程 以数学中的函数作为切入点&#xff0c;只关注参数之间的运算满足某种规则&#xff0c;例如zxy。 那么如何体现在编程中呢&#xff0c;熟知的function定义可以作…

Java 8函数式编程

函数式接口 一个接口中&#xff0c;有且只有一个抽象方法&#xff0c;这个接口就叫做函数式接口。常常使用FunctionalInterface注解作为编译校验。满足函数式接口的要求&#xff0c;才能校验通过&#xff0c;否则会在校验阶段失败。 接口中有且只能有一个抽象方法&#xff0c;…

【函数式编程实战】(一)Java演变与函数式编程

前言 &#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;专注于研究计算机底层/Java/Liunx 内核&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计&#x1f4eb; &#x1f3c6;CSDN专家博主/Java领域优质…

Java8 函数式编程

文章目录 Java 函数式编程1. Lambda 表达式1.1 标准格式1.2 使用前提1.2.1 一个参数1.2.2 多个参数1.2.3 有返回值 1.3 省略简化1.4 函数式接口1.4.1 Supplier1.4.2 Consumer1.4.3 Predicate1.4.4 Function 1.5 方法引用1.5.1 对象 :: 实例方法1.5.2 类 :: 静态方法1.5.3 类 ::…

入门 Java 函数式编程,看完这篇就清晰了

Java 在最开始是不支持函数式编程的&#xff0c;想来也好理解&#xff0c;因为在 Java 中类 Class 才是第一等公民&#xff0c;这就导致在 Java 中实现编程不是件那么容易的事儿&#xff0c;不过虽然难&#xff0c;但是结果我们也已经知道了&#xff0c;在 Java 8 这个大版本里…

Java函数式编程详解

Java从1.8以后引入了函数式编程&#xff0c;这是很大的一个改进。函数式编程的优点在提高编码的效率&#xff0c;增强代码的可读性。本文历时两个多月一点点写出来&#xff0c;即作为心得&#xff0c;亦作为交流。 1.Java函数式编程的语法&#xff1a; 使用Consumer作为示例&…

Java 函数式编程 详细介绍

在兼顾面向对象特性的基础上&#xff0c;Java语言通过Lambda表达式与方法引用等&#xff0c;为开发者打开了函数式编程的大门。 下面我们做一个初探。 Lambda的延迟执行 有些场景的代码执行后&#xff0c;结果不一定会被使用&#xff0c;从而造成性能浪费。而Lambda表达式是延…

Java基础函数式编程

本篇博文目录: 前言1.什么是函数式接口2.函数式编程(1) 使用Lambda表达式(2) Lambda表达式的进一步简化(3) Java内置函数式接口 3.方法引用(1) 方法引用的简单使用(2) 方法引用的分类 4.Stream API(1) 什么是Stream(2) 流式操作的执行流程(3) Stream的创建(4) Stream中间操作(5…

Java8新特性【函数式编程API、新时间日期处理API、Optional容器类】总结

文章目录 1、Lambda表达式1.1什么是Lambda表达式1.2从匿名类到 Lambda 的转换1.3Lambda表达式语法 2、函数式接口2.1什么是函数式接口2.2自定义函数式接口2.3内置核心函数式接口2.4接口中常用的默认方法 3、方法引用与构造器引用3.1 推荐用法3.2 基本格式3.3 语法详解(了解)3.3…

一文带你入门 Java 函数式编程

Java 在最开始是不支持函数式编程的&#xff0c;想来也好理解&#xff0c;因为在 Java 中类 Class 才是第一等公民&#xff0c;这就导致在 Java 中实现编程不是件那么容易的事儿&#xff0c;不过虽然难&#xff0c;但是结果我们也已经知道了&#xff0c;在 Java 8 这个大版本里…

Oracle数据库 存储过程入门

oracle存储过程:简单入门 一、定义 存储过程是一组为了完成特定功能的SQL语句&#xff0c;经编译后存储在数据库中。点击查看优缺点。二、存储过程简单入门 ***第一个存储过程&#xff1a;打印hello word, my name is stored procedure内容*** create or replace procedure m…

数据库储存过程超简单实例

网上看了半天都没找到一个完整储存过程从创建到调用的实例,于是自己写了一个简单的实例. 数据库创建存储过程,定义个函数 格式如下,开头DELIMITER //和结尾/DELIMITER 和BEGIN 和 END 是固定格式 定了一个叫test2()的方法(在mapper.xml中会指定这个函数名),in表示入参,varc…

DM8达梦数据库存储过程函数使用

DM8数据库的过程函数的编写主要分为4个部分&#xff1a;过程头部分&#xff0c;声明定义部分&#xff0c;执行部分和异常处理部分。在编写方面&#xff0c;过程和函数的主要区别还是函数可以返回一个值&#xff0c;但是过程没有。下面就从这4个部分来分别介绍过程的编写和一些常…

数据库:存储过程实验

一、实验目的及要求 目的 掌握存储过程的编写与调用 要求 掌握存储过程的编写&#xff1b;掌握存储过程的调用 二、实验条件 安装有SQL Server2014数据库的计算机 三、实验内容 使用事务、锁和游标&#xff1b;编写和使用存储过程&#xff1b;使用触发器 四、实验结果…

达梦数据库存储过程注意事项

引言&#xff1a;达梦数据库是一款国产数据库&#xff0c;在语法使用和函数方面和MySQL&#xff0c;Oracle有着很多相似的地方。但是也有一 些细微的区别。 1、先看一下达梦数据库的存储过程模板&#xff1a; CREATE OR REPLACE FUNCTION getName() AS OR IS DECLARE ... BEGI…

MySQL数据库-存储过程详解

存储过程简单来说&#xff0c;就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件&#xff0c;虽然它们的作用不仅限于批处理。在我看来&#xff0c; 存储过程就是有业务逻辑和流程的集合&#xff0c; 可以在存储过程中创建表&#xff0c;更新数据&#xff0c…

EXTJS5 入门指南

EXTJS5带领EXTJS步入了新的时代&#xff0c;Ext JS 5已经不再支持IE6、IE7和其他旧版本的浏览器了&#xff0c;这样可以显著减少跨整个框架的逻辑和样式设置。再加上额外的优化&#xff0c;Ext JS 5已经为企业级的Web应用程序迈出了惊人的一步。 EXTJS5不在和EXTJS4一样&#x…

ExtJS-入门(转载自http://www.blogjava.net/puras/archive)

2010 - 01 - 13 缩略显示 ExtJS-入门&#xff08;转载自http://www.blogjava.net/puras/archive&#xff09; 文章分类:Web前端 在ExtJS里最常用的,应该就是Ext.onReady这个方法了, 而且它也可能是你学习ExtJS所接触的第一个方法,这个方法在当前的DOM加载完毕后自动调用,保证…