10天学会kotlin DAY9 高阶函数DSL 手撕HTML,2024年最新安卓直播开发面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

elements.add(newTitle)

}

}

// Body 中转站

private open class Body(tagName: String) : TagClass(tagName = tagName) {

fun h1(action: H1.() -> Unit) {

val newH1 = H1()

newH1.action()

elements += newH1

}

fun p(action: P.() -> Unit) {

val newP = P()

newP.action()

elements += newP

}

open fun a(href: String, action: A.() -> Unit) {

val newA = A()

newA.href = href

newA.action()

elements += newA

}

}

// h1 中转站

private class H1 : Body(“h1”) {

}

// P 中转站

private class P : Body(“p”) {

fun b(action: B.() -> Unit) {

val newB = B()

newB.action()

elements += newB

}

override fun a(href: String, action: A.() -> Unit) {

val newA = A()

newA.href = href

newA.action()

elements += newA

}

fun ul(action: Ul.() -> Unit) {

val newUl = Ul()

newUl.action()

elements += newUl

}

}

// A 中转站

private class A : Body(“a”) {

var href: String

get() = attribute[“href”]!!

set(value) {

attribute[“href”] = value

}

}

// P 中转站

private class B : Body(“b”) {

}

// Ul 中转站

private class Ul : Body(“ul”) {

fun li(action: Li.() -> Unit) {

val newLi = Li()

newLi.action()

elements.add(newLi)

}

}

// Li 中转站

private class Li : Body(“li”) {}

// Title 中转站

private class Title : TagClass(“title”) {

}

private fun html(action: Html.() -> Unit): Html {

val html = Html()

html.action()

return html

}

fun main(args: Array) {

val names = listOf(“张三”, “大漂亮”, “王美丽”)

val result =

html { // this == 第一个中转站 { head body 。。 }

head { // this == head中转站 { title }

title { +“使用 Kotlin 进行 HTML 编码” }

}

body { // this == body中转站 { h1 p a p }

h1 { // this == h1中转站 { 未知 }

}

p { -“此格式可用作 HTML 的替代标记” }

// 具有属性和文本内容的元素

a(href = “https://blog.csdn.net/u010755471”) { -“不爱学习的猪的博客” }

// 混合内容

p {

-“Derry老师来了”

b { -“Derry是谁” }

-“文本。有关更多信息,请参阅”

a(href = “https://blog.csdn.net/u010755471”) { -“不爱学习的猪的博客” }

-“Derry的项目”

}

p { -“一些文字” }

// 从命令行参数生成的内容

p {

-“命令行参数是:”

ul { // this == UL中转站 { li 子标签 }

for (name in names)

li { -name } // this == LI中转站

}

}

}

}

println(result)

val file = File(“/Users/Documents/Android leaning work/kotlinleaning04/testHtml.html”)

file.writeText(result.toString())

}

二、使用 DSL 解析HTML

=============================================================================

先来张图

在这里插入图片描述

源码如下:

import java.io.File

// 定义一个节点接口

interface Node {

fun create(): String

}

// 中转站

class BlockNode(val name: String) : Node {

val children = ArrayList() // 节点集合: html head body

private val properties = hashMapOf<String, Any>() //属性集合:style=‘color: white; font-family: Microsoft YaHei’

override fun create(): String {

return “”“<$name KaTeX parse error: Expected '}', got 'EOF' at end of input: …perties.map { "{it.key}='KaTeX parse error: Expected 'EOF', got '}' at position 14: {it.value}'" }̲.joinToString("…{children.joinToString ( “” ){it.create()}}</$name”“”

}

operator fun String.invoke(action: BlockNode.() -> Unit){

val stringNode = BlockNode(this)

stringNode.action()

this@BlockNode.children += stringNode

}

operator fun String.invoke(value: Any){

this@BlockNode.properties[this] = value

}

operator fun String.unaryPlus(){

val stringNode = StringNode(“$this &sbsp; &sbsp;”)

this@BlockNode.children += stringNode

}

}

class StringNode(private val value: String) : Node {

override fun create(): String {

return value

}

}

fun html(action: BlockNode.() -> Unit): BlockNode {

val blockNode = BlockNode(“html”)

blockNode.action()

return blockNode

}

fun BlockNode.head(action: BlockNode.() -> Unit) {

val head = BlockNode(“head”)

head.action()

children += head

}

fun BlockNode.body(action: BlockNode.() -> Unit) {

val body = BlockNode(“body”)

body.action()

children += body

}

fun main() {

val htmlContent = html { // this持有中转站BlockNode

head { // this持有中转站BlockNode

// String.invoke(Any)

“meta” { “charset”(“UTF-8”) }

}

body {

“div” {

“style”(

“”"

width: 666px;

height: 666px;

line-height: 600px;

background-color: #F00;

text-align: center

“”".trimIndent()

总结

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

Android大厂面试真题全套解析

2017-2020字节跳动Android面试真题解析PDF
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

[外链图片转存中…(img-npo2Pj8g-1713411538706)]

[外链图片转存中…(img-48Vk35R6-1713411538706)]
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-dusuA8hE-1713411538707)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值