length函数相关知识
-
Scss进阶篇2length()函数length() 函数主要用来返回一个列表中有几个值,简单点说就是返回列表清单中有多少个值:>> length(10px)1>> length(10px 20px (border 1px solid) 2em)4>> length(border 1px solid)3length() 函数中的列表参数之间使用空格隔开,不能使用逗号,否则函数将会出错:>> length(10px,20px,(border 1px solid),2em)SyntaxError: wrong number of arguments (4 for 1) for `length' >> length(1,2px) Syn
-
应用Collection.sort.实现随机字符串的排序package practice; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class TestSort { /** * 对随机字符串进行排序 * @param args */ public void Sort(){ List<String> list = new ArrayList<String>(); //org.apache.commons.lang包下有一个RandomStringUtils类,其中有一个randomAlphanumeric(int length)函数, //可以随机生成一个长度为length的字符串。 // String filename=Random
-
SQL Server SUBSTRING FunctionsSUBSTRING(string, start, length)函数,是处理字符数据获取子字符串。第一个参数是将要处理的字符串,第二个参数是指定位置开始,最后一个参数是截取长度。例子:原数据,如'Mr. John'SELECT SUBSTRING([Name],4,5) AS [Name] FROM [dbo].[Member] 执行结果 'John'。
-
java中的size,length,length()的区别java中的size,length,length()的区别一、size()java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性二、length()java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法三、lengthjava中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!四、例子public class TEST { public static void main(String[] args) { String[] strs={"北京","上海","田径&q
length函数相关课程
-
PHP函数篇 本教程结合实例形式分析了PHP关于自定义函数的创建、返回值、默认值、参数、值传递、作用域 以及可变函数、嵌套函数、递归函数、闭包函数的使用等相关技巧。
讲师:顾金鹤 入门 22630人正在学习
-
JAVA 函数式编程 本课程以 Java 11 为编译环境,讲解了 Java 对函数式编程支持,以及用实战小例子演示如何使用函数式简洁优雅的直击问题核心逻辑。另,老师新作 《Spring Security+OAuth2 精讲 多场景打造企业级认证与授权》https://coding.imooc.com/class/455.html 也上线啦,课程中将结合前后端分离的权限管理应用,基于从单体到微服务的演进,精讲主流安全框架 Spring Security5.x 的核心技术,一站式覆盖目前企业主流认证授权的方方面面,感兴趣的同学,可以关注一下,欢迎撒花拍砖~~
讲师:接灰的电子产品 初级 10811人正在学习
length函数相关教程
- 1.12 length 返回输入值的长度,输入的可以是字符串和列表。示例如下:{{ value|length }}如果 value 的值为:[‘a’, ‘b’, ‘c’, ‘d’] 或者 ‘abcd’,输出都是4。对于未定义的变量值,输出为0。它的实现代码也是非常简单,如下:@register.filter(is_safe=False)def length(value): """Return the length of the value - useful for lists.""" try: return len(value) except (ValueError, TypeError): return 0
- 2. 函数参数 在讲解剩余参数前,我们先来看看,剩余参数在函数参数中都解决了哪些问题?为什么会引入剩余参数的概念?在 ES5 中,函数经常会传入不定参数,在传入不定参数时,ES5 的给出的解决方案是通过 arguments 对象来获取函数调用时传递的参数。 arguments 对象不是一个数组,它是一个类数组对象,所谓类数组对象,就是指可以通过索引属性访问元素并且拥有 length 属性的对象。一个简单的类数组对象是长这样的:var arrLike = { 0: 'name', 1: 'age', 2: 'job', length: 3}而它所对应的数组应该是这样子的:var arr = ['name', 'age', 'job'];这里我们说类数组对象与数组的性质相似,是因为类数组对象在访问、赋值、获取长度上的操作与数组是一致的,具体内容可查阅相关的类数组使用。在函数体中定义了 Arguments 对象,其包含函数的参数和其它属性,以 arguments 变量来指代。下面我们看个实例:function fn() { console.log(arguments);}fn('imooc', 7, 'ES6')在控制台中打印出上面的代码结果,如下图所示:在定义函数的时候没有给定参数,但是通过 arguments 对象可以拿到传入的参数。可以看到 arguments 中包含了函数传递的参数、length 等属性,length 属性表示的是实参的长度,即调用函数的时候传入的参数个数。这样我们就对 arguments 对象有了一定的了解。在 ES5 的开发模式下,想要使用传递的参数,则需要按位置把对应的参数取出来。尽管 arguments 是一个类数组且可遍历的变量,但它终究不是数组,它不支持数组方法,因此我们不能调用 arguments.forEeach (…) 等数组的方法。需要使用一些特殊的方法转换成数组使用,如:function fn() { var arr = [].slice.call(arguments); console.log(arr)}fn('ES6');// ["ES6"]fn('imooc', 7, 'ES6');// ["imooc", 7, "ES6"]终于借助 call 方法把 arguments 转化成一个真正的数组了。但是这样无疑是一个繁琐的过程,而且不容易理解。这时 ES6 给出了它的完美解决方案 —— 剩余参数,那剩余参数是如何在函数传参中使用的呢?下面我们来看看实例:function fn(...args) { console.log(args)}fn('ES6');// ["ES6"]fn('imooc', 7, 'ES6');// ["imooc", 7, "ES6"]使用方式很简单在函数定义时使用 ... 紧接着跟一个收集的参数,这个收集的参数就是我们所传入不定参数的集合 —— 也就是数组。这样就很简单地摆脱了 arguments 的束缚。另外,还可以指定一个默认的参数,如下示例:function fn(name, ...args) { console.log(name); // 基础参数 console.log(args); // 剩下的参数组成的数组}fn('ES6');// 'ES6'// []fn('imooc', 7, 'ES6');// "imooc"// [7, "ES6"]上面的代码中给函数第一个参数,声明一个变量 name,剩余的参数会被 ... 收集成一个数组,这就是剩余参数。引入剩余参数就是为了能替代函数内部的 arguments,由于 arguments 对象不具备数组的方法,所以很多时候在使用之前要先转换成一个数组。而剩余参数本来就是一个数组,避免了这多余的一步,使用起来既优雅又自然。
- 2.3 执行收集的函数 上面的内容是依赖收集的过程,主要在响应式数据获取时执行,也就是在调用 createGetter 的时候执行,那么依赖收集完后,当数据发生变化的时候,需要让收集的回调函数依次执行。而执行这样收集函数的过程是在 createSetter 中完成,因为在这里是更新数据的过程。上节中我们在 createSetter 中预留了新增和更新属性的判断:function createSetter() { return function get(target, key, value, receiver) { ... if (!hadKey) { console.log('新增属性'); trigger(target, 'ADD', key, value) } else if (hasChanged(value, oldValue)) { console.log('更新属性'); trigger(target, 'SET', key, value, oldValue) } return result; };}Vue3 中执行依赖的函数是 trigger,这个函数一共接受五个参数,在执行 trigger 时会传入修改数据的类型:新增(ADD)和更新(SET),这是 Vue 为了处理不同场景而设置的属性。这里我们先创建 tigger 函数,首先需要判断在 targetMap 中是否有被依赖的对象,没有则直接返回。export function trigger(target, type, key, newValue, oldValue) { const depsMap = targetMap.get(target) if (!depsMap) { return }}如何让依赖的 effect 执行呢?首先要判断 key 是不是 undefined;获取 key 中的 effect 函数,并执行。export function trigger(target, type, key, newValue, oldValue) { const depsMap = targetMap.get(target) if (!depsMap) { return } const run = (effects) => { if (effects) { effects.forEarch(effect => effect()) } } if (key == void 0) { run(depsMap.get(key)); }}上面是对对象的处理,但是在处理数组的时候还会有问题,如下代码:const state = reactive([1,2,3]);effect(() => { document.getElementById('app').innerHTML = state[2];})setTimeout(() => { state.length = 1;}, 1000)上面的代码中,数据变化是直接更新数组的长度,而在 effect 中没有使用 length 属性,所以在更新 length 属性时不会触发 run(depsMap.get(key)); 的依次执行,这样 length 改变 effect 回调函数不会执行,视图也不会被更新。这时就需要对属性是 length 的数组进行验证,如果直接更新的是数组的长度就需要单独处理:export function trigger(target, type, key, newValue, oldValue) { const depsMap = targetMap.get(target) if (!depsMap) { return } const run = (effects) => { if (effects) { effects.forEarch(effect => effect()) } } if (key === 'length' && isArray(target)) { depsMap.forEarch((deps, key) => { if(key === 'length' || key >= newValue) { // newValue是更新后的值, run(deps) } }) } else { if (key == void 0) { run(depsMap.get(key)); } }}上面的代码是在修改数组 length 属性时,让收集依赖的函数执行。还有一种情况,是在 effect 回调中没有直接取索引的值,而且在修改数组时,直接在超过数组长度的位置上新增一个元素。const state = reactive([1,2,3]);effect(() => { document.getElementById('app').innerHTML = state;})setTimeout(() => { state[5] = 5;}, 1000)在这种情况下也没有索引 key 进行收集,但是确实使用数组的索引增加了值。这时我们就需要借助 trigger 中的 type 类型来进行处理,当对数组索引进行添加操作时,需要触发数组的更新。export function trigger(target, type, key, newValue, oldValue) { const depsMap = targetMap.get(target) if (!depsMap) { return } const run = (effects) => { if (effects) { effects.forEarch(effect => effect()) } } if (key === 'length' && isArray(target)) { depsMap.forEarch((deps, key) => { if(key === 'length' || key >= newValue) { // newValue是更新后的值, run(deps) } }) } else { if (key == void 0) { run(depsMap.get(key)); } switch (type) { case 'ADD': if(isArray(target)) { if(isIntergerKey) { // 判断key是否是索引类型 run(depsMap.get('length')); // 新增属性时直接触发length收集的依赖即可 } } break; } }}这样我们就基本上实现了 effect 的响应式的源码。
- 3. Content-Length 告知客户端内容的长度:Content-Length: 5106
- 411 Length Required 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。
- 1.2 技巧二:扩展函数让你的开发效率倍增 扩展函数可以说是 Kotlin 中最吸引开发者之一的语法特性,有了它代码开发效率不仅仅一点点,此外它还能让你的代码变得更具有可维护性。关于扩展函数的定义就不展开了,之前文章中有。下面我会列出几个场景,Kotlin 扩展如何让你代码变得更少更简洁。场景一: ImageView 的扩展函数 loadUrl这里以 ImageView 加载网络图片场景举例假如有 3 个 Activity (可以扩展若干个 Activity) 都需要加载网络图片,也是 Android 开发中最为频繁的场景。相信这样加载图片代码写法一定让你值得收藏。(这里就以 Glide 图片库举例)在 Java 中实现 ImageView 加载网络图片://MainActivity加载图片public class MainActivity extends AppCompatActivity { private ImageView mIvPoster; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIvPoster = findViewById(R.id.movie_iv_poster); Glide.with(context).load("http://goo.gl/gEgYUd").into(mIvPoster); }} //Main2Activity加载图片public class MainActivity extends AppCompatActivity { private ImageView mIvPoster; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); mIvPoster = findViewById(R.id.movie_iv_poster); Glide.with(context).load("http://goo.gl/gEgYUd").into(mIvPoster); }} //Main3Activity加载图片public class MainActivity extends AppCompatActivity { private ImageView mIvPoster; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); mIvPoster = findViewById(R.id.movie_iv_poster); Glide.with(context).load("http://goo.gl/gEgYUd").into(mIvPoster);//虽然Glide可以做到很简单也是一行代码,但是每次都需要写 Glide.with(context)这些代码。 }} 想象下上述代码如果很多 Activity 每次都需要编写重复的代码。此外还有一个问题就是比如后面图片从 Glide 迁移到其他图片库,并且写法上也和 Glide 一样,这时候的重构只能每处使用 Glide 加载图片地方都得修改,如果整个项目是大型项目各个业务到处都是 Glide 图片写法。就会造成重构成本加大。如果 Kotlin 的扩展函数不仅让写法更简单,反而也能解决后续维护和迁移成本,那么是不是绝妙呢。使用 Kotlin 扩展函数实现 ImageView 加载网络图片://先定义一个图片加载的扩展函数fun ImageView.loadUrl(url: String) { Glide.with(context).load(url).into(this)//也是这么简单的一行,但是仅仅需要写这么一次就可以,后续无需再答复。}//MainActivity加载图片class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) movie_iv_poster.loadUrl(""http://goo.gl/gEgYUd"")//仅仅需要这么一行,无论在哪个Activity都需要这么一行就能实现图片加载就可以了。 //此外这样代码更具有可读性,loadUrl就像是ImageView组件中自带的函数。 }} //Main2Activity加载图片class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) movie_iv_poster.loadUrl(""http://goo.gl/gEgYUd"") }} //Main3Activity加载图片class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main3) movie_iv_poster.loadUrl(""http://goo.gl/gEgYUd"") }} 可以看到 Kotlin 的 ImageView 扩展函数 loadUrl 更具可读性,就像是 ImageView 组件中自带加载网络图片的函数。此外及时后续 Glide 图片加载库迁移了,上层业务代码使用 loadUrl 地方都可以不用修改,保证了上层业务代码接口稳定性,只要修改 loadUrl 扩展函数内部的实现即可,非常简单。场景二: TextView 的扩展函数 SpannableStringBuilder我们都知道 Android 开发中,经常会利用 TextView 实现同一个文本中不同文字样式标注,比如部分加粗、变颜色、变字体样式、加下划线等。遇到这样的需求时我们可以很自然地想到使用 TextView 中的 SpannableStringBuilder 来实现,但是相信大家一定对于 SpannableStringBuilder 实现代码比较麻烦,每次都需要指定 star,end 然后就会去算字第几个啥的,是不是很麻烦,看看 Kotlin 扩展函数如何助你一臂之力。在 Java 中实现以上场景 UI 效果:public class Main2Activity extends AppCompatActivity { private TextView mTvSpan; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); mTvSpan = findViewById(R.id.span_tv); SpannableStringBuilder sb = new SpannableStringBuilder(); String text1 = "我们发布了"; String text2 = "Jetpack Compose for Desktop"; String text3 = "第一个里程碑"; String text4 = "版本的正式版"; sb.append(text1); sb.append(text2); sb.append(text3); sb.append(text4); //以下代码可以说是编写Span代码基本模板,写起来也是比较麻烦的。 ForegroundColorSpan colorSpan1 = new ForegroundColorSpan(Color.parseColor("#333333")); StyleSpan styleSpan1 = new StyleSpan(Typeface.ITALIC); sb.setSpan(colorSpan1, 0, text1.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); sb.setSpan(styleSpan1, 0, text1.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(Color.parseColor("#ff9900")); StyleSpan styleSpan2 = new StyleSpan(Typeface.BOLD); sb.setSpan(colorSpan2, text1.length(), text1.length() + text2.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); sb.setSpan(styleSpan2, text1.length(), text1.length() + text2.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); UnderlineSpan underlineSpan = new UnderlineSpan(); sb.setSpan(underlineSpan, text1.length() + text2.length(), text1.length() + text2.length() + text3.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); ForegroundColorSpan colorSpan3 = new ForegroundColorSpan(Color.parseColor("#ff0000")); sb.setSpan(colorSpan3, text1.length() + text2.length() + text3.length(), text1.length() + text2.length() + text3.length() + text4.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_INCLUSIVE); mTvSpan.setText(sb); }}上述 Java 实现上面效果大概需要近 45 行代码,而且每次写起来也比较麻烦,那么使用 Kotlin 扩展函数是不是更方便呢?一起来看下:Kotlin 扩展函数实现上述效果:class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //可以看到Kotlin屏蔽了具体start和end指定以及一些模板,仅仅需要核心代码十几行即可搞定,而且后续可持续复用 span_tv.text = buildSpannedString { inSpans(ForegroundColorSpan(Color.parseColor("#333333")), StyleSpan(Typeface.ITALIC)) { append("我们发布了") } inSpans(ForegroundColorSpan(Color.parseColor("#ff9900")), StyleSpan(Typeface.BOLD)) { append("Jetpack Compose for Desktop") } underline { append("第一个里程碑") } color(Color.parseColor("#ff0000")) { append("版本的正式版") } } }}下面给出 SpannbleStringBuilder 的扩展函数:inline fun buildSpannedString(builderAction: SpannableStringBuilder.() -> Unit): SpannedString { val builder = SpannableStringBuilder() builder.builderAction() return SpannedString(builder)}inline fun SpannableStringBuilder.inSpans( vararg spans: Any, builderAction: SpannableStringBuilder.() -> Unit): SpannableStringBuilder { val start = length builderAction() for (span in spans) setSpan(span, start, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) return this}inline fun SpannableStringBuilder.italic(builderAction: SpannableStringBuilder.() -> Unit) = inSpans(StyleSpan(Typeface.ITALIC), builderAction = builderAction)inline fun SpannableStringBuilder.underline(builderAction: SpannableStringBuilder.() -> Unit) = inSpans(UnderlineSpan(), builderAction = builderAction)inline fun SpannableStringBuilder.color( @ColorInt color: Int, builderAction: SpannableStringBuilder.() -> Unit) = inSpans(ForegroundColorSpan(color), builderAction = builderAction)其实关于扩展函数的场景还有很多很多,所以官方特地整理一个库: androidx-core-ktx, 这里面收录了 Android 中常用的 Kotlin 扩展函数。这里还给出一些常用的扩展函数://TextView加粗fun TextView.isBold() { this.paint.isFakeBoldText = true}//TextView设置左、上、右、下 图标+文字的样式,包括支持定义图标的颜色fun TextView.setCompoundDrawablesKt( leftDrawable: Drawable? = null, topDrawable: Drawable? = null, rightDrawable: Drawable? = null, bottomDrawable: Drawable? = null, tintColor: Int = -1) { this.setCompoundDrawables(leftDrawable?.getTintDrawable(tintColor)?.apply { setBounds(0, 0, intrinsicWidth, intrinsicHeight) }, topDrawable?.getTintDrawable(tintColor)?.apply { setBounds(0, 0, intrinsicWidth, intrinsicHeight) }, rightDrawable?.getTintDrawable(tintColor)?.apply { setBounds(0, 0, intrinsicWidth, intrinsicHeight) }, bottomDrawable?.getTintDrawable(tintColor)?.apply { setBounds(0, 0, intrinsicWidth, intrinsicHeight) })}//设置View的Marginfun View.setMargins(leftMargin: Int = 0, topMargin: Int = 0, rightMargin: Int = 0, bottomMargin: Int = 0) { val layoutParams = (this.layoutParams ?: return) as? ViewGroup.MarginLayoutParams ?: return if(leftMargin > 0) { layoutParams.leftMargin = leftMargin } if(topMargin > 0) { layoutParams.topMargin = topMargin } if(rightMargin > 0) { layoutParams.rightMargin = rightMargin } if(bottomMargin > 0) { layoutParams.bottomMargin = bottomMargin } this.layoutParams = layoutParams}//常用的Context扩展,比如Toast以及设置颜色和Drawablefun Context.getColorCompat(@ColorRes color: Int): Int = ContextCompat.getColor(this, color)fun Context.getDrawableCompat(@DrawableRes drawable: Int): Drawable { return ContextCompat.getDrawable(this, drawable) ?: ColorDrawable()}fun Context.showToast(text: String, isShort: Boolean = true) { Toast.makeText(this, text, isShort.yes { Toast.LENGTH_SHORT }.otherwise { Toast.LENGTH_LONG }) .show()}
length函数相关搜索
-
label
labelfor
label标签
lambda
lambda表达式
lamda
lang
last
latin
latin1
layers
layui
leave
left
leftarrow
legend
length
lengths
length函数
less